有找到没用的历史数据进行清理吗

回复

MySQLwjxiaoit 发起了问题 • 1 人关注 • 0 个回复 • 7 次浏览 • 1 天前 • 来自相关话题

有找到没用的历史数据进行清理吗

回复

MySQLwjxiaoit 发起了问题 • 1 人关注 • 0 个回复 • 8 次浏览 • 1 天前 • 来自相关话题

有关数据类型与其占用空间计算方式

MySQLcfanbo 回复了问题 • 2 人关注 • 2 个回复 • 52 次浏览 • 4 天前 • 来自相关话题

知数堂公开课第30期分享-知数堂第30次公开课: 分享MySQL数据库中MVCC的实现方式

MySQLwubx 发表了文章 • 0 个评论 • 10 次浏览 • 5 天前 • 来自相关话题

知数堂第30次公开课: 
      分享MySQL数据库中MVCC的实现方式,以及Undo,Redo Log的工作机制,MySQL中Sharp、Fuzzy两种CheckPoint实现方式。

报名地址:  http://www.itdks.com/dakashuo/playback/273 查看全部
知数堂第30次公开课: 
      分享MySQL数据库中MVCC的实现方式,以及Undo,Redo Log的工作机制,MySQL中Sharp、Fuzzy两种CheckPoint实现方式。

报名地址:  http://www.itdks.com/dakashuo/playback/273

tokudb

MySQLsmile 回复了问题 • 2 人关注 • 2 个回复 • 36 次浏览 • 6 天前 • 来自相关话题

check_gtid_sync.py用于检查从库接收的GTID是否执行完成

MySQLkeung 发表了文章 • 0 个评论 • 21 次浏览 • 2017-01-10 01:07 • 来自相关话题

check_gtid_sync.py参考用法
python check_gtid_sync.py --host="172.16.60.60“ --port=3306 --user="monitor" --password="monitor4lepus"

脚本内容如下#!/usr/bin/env python
#coding: utf-8

import re
import sys
import argparse
import pymysql.cursors

parser = argparse.ArgumentParser()

class CheckMySQL(object):
def __init__(self, host=None, port=None, user=None, passwd=None):
self.dbhost = host
self.dbport = port
self.dbuser = user
self.dbpassword = passwd

def connect(self):
try:
conn = pymysql.connect(self.dbhost, self.dbuser, self.dbpassword, port=self.dbport, charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
conn.commit()
except Exception, e:
print(e)
return 1
return cursor

def isGTID_sync(self):
try:
with self.connect() as cursor:
cursor.execute("show slave status")
result = cursor.fetchone()
cursor.close()
retd_gtid = int(result.get("Retrieved_Gtid_Set").split("-")[-1])
exec_gtid = int(result.get("Executed_Gtid_Set").split("-")[-1])
if retd_gtid == exec_gtid:
result = "OK"
elif retd_gtid > exec_gtid:
result = "Gtid_Set_Behind_Master: %s" % (retd_gtid - exec_gtid)
except Exception, e:
print(e)
return "ERROR"
return result


if __name__== "__main__":
parser.add_argument("--host", type=str, help="mysql server host")
parser.add_argument("--port", type=int, help="mysql server port")
parser.add_argument("--user", type=str, help="mysql server user")
parser.add_argument("--password", type=str, help="mysql server passwd")
args = parser.parse_args()
if not args.host or not args.port or not args.user or not args.password:
print parser.format_usage()
sys.exit(1)

host=args.host
port=args.port
user=args.user
passwd=args.password
check=CheckMySQL(host,port,user,passwd)
isSync = check.isGTID_sync()
print isSync 查看全部
check_gtid_sync.py参考用法
python check_gtid_sync.py --host="172.16.60.60“ --port=3306 --user="monitor" --password="monitor4lepus"

脚本内容如下
#!/usr/bin/env python
#coding: utf-8

import re
import sys
import argparse
import pymysql.cursors

parser = argparse.ArgumentParser()

class CheckMySQL(object):
def __init__(self, host=None, port=None, user=None, passwd=None):
self.dbhost = host
self.dbport = port
self.dbuser = user
self.dbpassword = passwd

def connect(self):
try:
conn = pymysql.connect(self.dbhost, self.dbuser, self.dbpassword, port=self.dbport, charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
conn.commit()
except Exception, e:
print(e)
return 1
return cursor

def isGTID_sync(self):
try:
with self.connect() as cursor:
cursor.execute("show slave status")
result = cursor.fetchone()
cursor.close()
retd_gtid = int(result.get("Retrieved_Gtid_Set").split("-")[-1])
exec_gtid = int(result.get("Executed_Gtid_Set").split("-")[-1])
if retd_gtid == exec_gtid:
result = "OK"
elif retd_gtid > exec_gtid:
result = "Gtid_Set_Behind_Master: %s" % (retd_gtid - exec_gtid)
except Exception, e:
print(e)
return "ERROR"
return result


if __name__== "__main__":
parser.add_argument("--host", type=str, help="mysql server host")
parser.add_argument("--port", type=int, help="mysql server port")
parser.add_argument("--user", type=str, help="mysql server user")
parser.add_argument("--password", type=str, help="mysql server passwd")
args = parser.parse_args()
if not args.host or not args.port or not args.user or not args.password:
print parser.format_usage()
sys.exit(1)

host=args.host
port=args.port
user=args.user
passwd=args.password
check=CheckMySQL(host,port,user,passwd)
isSync = check.isGTID_sync()
print isSync

tokudb于percona-server5.7.16 源码编译安装

MySQLyangjustins 发表了文章 • 0 个评论 • 20 次浏览 • 2017-01-05 16:08 • 来自相关话题

看到有人发tokudb的安装过程,我也写一篇自己源码编译的过程.因为是之前写的简要步骤,所以就没有安装过程的实例展示了.....
ps:至于为什么非要用源码编译,是因为,之前线上用的是源码编译的,然后现在要扩展tokudb,所以就研究了下,有兴趣可以一起探讨.
 
 

tokudb是percona出的一个引擎.跟大多数引擎一样.安装采用插件式安装即可;

1.安装前准备:
1.1需要关闭Transparent huge pages:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

1.2修改selinux:
# vi /etc/selinux/config 
若要临时生效,可以执行:# setenforce 0


2.下载最新的percona server源码包和相同版本的二进制包;

3.安装mysql过程:
3.1安装依赖包:
yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc -y

这是之前传统的源码依赖包,如果需要使用tokudb 还需要安装jemalloc  valgrind valgrind-devel

yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc jemalloc  valgrind valgrind-devel -y


3.2
编译:
 cmake -DCMAKE_INSTALL_PREFIX=/home/mysql3313/ -DMYSQL_DATADIR=/home/mysql3313/data -DSYSCONFDIR=/home/mysql3313 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DMYSQL_UNIX_ADDR=/home/mysql3313/mysql.sock -DMYSQL_TCP_PORT=3313 -DENABLED_LOCAL_INFILE=1  -DENABLE_DOWNLOADS=1  -DCOMPILATION_COMMENT="Percona Server"  -DOPTIMIZER_TRACE=1   -DWITH_ZLIB=system  -DWITH_VALGRIND=1  -DCMAKE_C_FLAGS=-DHAVE_purify  -DCMAKE_CXX_FLAGS=-DHAVE_purify -DWITH_PARTITION_STORAGE_ENGINE=1    -DZLIB_INCLUDE_DIR=/usr/lib64 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DMYSQL_USER=mysql  -DWITH_BOOST=/usr/local/boost


make
make install

3.3 初始化:
bin/mysqld --defaults-file=/home/mysql3313/my.cnf  --initialize --user=mysql 

3.4 启动:
support-files/mysql.server start

3.5 修改root密码
alter USER root@'localhost'  IDENTIFIED BY 'new_password'

4.安装tokudb
安装tokudb插件之前,需要copy插件包,(因为在源码包的编译方式中没有编译tokudb的插件包);
从官方网站下载相同版本的二进制包,将解压后的二进制包里面  lib/mysql/目录下(libjemalloc.so  libjemalloc.so.1)两个文件copy到相同目录(/home/mysql3313/lib/mysql/)
                                                         lib/mysql/plugin/ha_tokudb.so 文件copy到相同目录(/home/mysql3313/lib/mysql/plugin/)
然后记得给刚copy的几个文件更改用户
chown mysql:mysql -R /home/mysql3313/lib/mysql*


安装tokudb插件:
INSTALL PLUGIN TokuDB SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_lock_waits SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_background_job_status SONAME 'ha_tokudb.so';

检查:
show engines;
show plugins;


tokudb是引擎插件,跟其他插件方式不一样.只需要安装一次就行了.重启后依然有效. 查看全部
看到有人发tokudb的安装过程,我也写一篇自己源码编译的过程.因为是之前写的简要步骤,所以就没有安装过程的实例展示了.....
ps:至于为什么非要用源码编译,是因为,之前线上用的是源码编译的,然后现在要扩展tokudb,所以就研究了下,有兴趣可以一起探讨.
 
 

tokudb是percona出的一个引擎.跟大多数引擎一样.安装采用插件式安装即可;

1.安装前准备:
1.1需要关闭Transparent huge pages:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

1.2修改selinux:
# vi /etc/selinux/config 
若要临时生效,可以执行:# setenforce 0


2.下载最新的percona server源码包和相同版本的二进制包;

3.安装mysql过程:
3.1安装依赖包:
yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc -y

这是之前传统的源码依赖包,如果需要使用tokudb 还需要安装jemalloc  valgrind valgrind-devel

yum install gcc gcc-c++ ncurses readline-devel ncurses-devel bison bison-devel vim vim-enhanced readline readline-devel libaio libaio-devel make cmake libtermcap libtermcap-devel imake autoconf automake libtool m4 libstdc++-devel zlib-devel readline-devel glibc jemalloc  valgrind valgrind-devel -y


3.2
编译:
 cmake -DCMAKE_INSTALL_PREFIX=/home/mysql3313/ -DMYSQL_DATADIR=/home/mysql3313/data -DSYSCONFDIR=/home/mysql3313 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1  -DMYSQL_UNIX_ADDR=/home/mysql3313/mysql.sock -DMYSQL_TCP_PORT=3313 -DENABLED_LOCAL_INFILE=1  -DENABLE_DOWNLOADS=1  -DCOMPILATION_COMMENT="Percona Server"  -DOPTIMIZER_TRACE=1   -DWITH_ZLIB=system  -DWITH_VALGRIND=1  -DCMAKE_C_FLAGS=-DHAVE_purify  -DCMAKE_CXX_FLAGS=-DHAVE_purify -DWITH_PARTITION_STORAGE_ENGINE=1    -DZLIB_INCLUDE_DIR=/usr/lib64 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci  -DMYSQL_USER=mysql  -DWITH_BOOST=/usr/local/boost


make
make install

3.3 初始化:
bin/mysqld --defaults-file=/home/mysql3313/my.cnf  --initialize --user=mysql 

3.4 启动:
support-files/mysql.server start

3.5 修改root密码
alter USER root@'localhost'  IDENTIFIED BY 'new_password'

4.安装tokudb
安装tokudb插件之前,需要copy插件包,(因为在源码包的编译方式中没有编译tokudb的插件包);
从官方网站下载相同版本的二进制包,将解压后的二进制包里面  lib/mysql/目录下(libjemalloc.so  libjemalloc.so.1)两个文件copy到相同目录(/home/mysql3313/lib/mysql/)
                                                         lib/mysql/plugin/ha_tokudb.so 文件copy到相同目录(/home/mysql3313/lib/mysql/plugin/)
然后记得给刚copy的几个文件更改用户
chown mysql:mysql -R /home/mysql3313/lib/mysql*


安装tokudb插件:
INSTALL PLUGIN TokuDB SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_lock_waits SONAME 'ha_tokudb.so';
INSTALL PLUGIN TokuDB_background_job_status SONAME 'ha_tokudb.so';

检查:
show engines;
show plugins;


tokudb是引擎插件,跟其他插件方式不一样.只需要安装一次就行了.重启后依然有效.











tokudb安装过程

MySQLsmile 发表了文章 • 1 个评论 • 19 次浏览 • 2017-01-05 12:59 • 来自相关话题

安装mysql5.6.25

1.下载安装包:wget http://cdn.mysql.com/archives/ ... ar.gz2. 将mysql解压到/opt/mysql下tar zxvf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz3. 创建一个软链,便于版本升级cd /usr/local/ ln -s /opt/mysql/mysql-5.6.27-linux-glibc2.5-x86_64 mysql4. 创建MySQL启动用户groupadd mysql useradd -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
chown -R mysql:mysql /usr/local/mysql5. 创建基本的目录mkdir -p /data/mysql/mysql3306/{data,logs,tmp} chown -R mysql:mysql /data/mysql/mysql33066. 创建/etc/my.cnf配置文件(见附件)[root@localhost mysql]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/tmp/mysql.sock
user=mysql
port = 3306

symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
port = 3306
socket = /tmp/mysql.sock7. 做MySQL初始化cd /usr/local/mysql ./scripts/mysql_install_db8. 创建一个启动脚本cp support-files/mysql.server /etc/init.d/mysql9. 启动和关闭/etc/init.d/mysql start|stop|restart


[root@localhost mysql]# /etc/init.d/mysql start

Starting MySQL..                                           [确定]

[root@localhost mysql]# /etc/init.d/mysql stop

Shutting down MySQL..                                      [确定]

10.设置环境变量

[root@localhost mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

[root@localhost mysql]# source /etc/profile

11.进入数据库

mysql

安装jemalloc库

wget http://www.canonware.com/downl ... r.bz2
tar jxvf jemalloc-3.4.1.tar.bz2
cd jemalloc-3.4.1
./configure --prefix=/usr/local/jemalloc-3.4.1
make && make install
ldconfig#配置文件
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
plugin-dir = /usr/local/mysql/lib/mysql/plugin
malloc-lib= /usr/local/jemalloc-3.4.1/lib/libjemalloc.so
plugin-load=ha_tokudb.so
#安装tokudb
1.解压
[root@localhost software]# tar -zxf Percona-Server-5.6.25-rel73.1-TokuDB.Linux.x86_64.ssl101.tar.gz
2.解压后目录如下
[root@localhost Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101]# ls
bin  lib  mysql-test  README-TOKUDB
3. 把相关目录放到BASEDIR下
[root@localhost software]# cp -r Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101/* /usr/local/mysql
4.启动之前,停用transparent huge pages
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
5.启动数据库,并进入数据库
[root@localhost software]# /etc/init.d/mysql start
Starting MySQL..                                           [确定]
[root@localhost software]# mysql
6.手动添加plugin
INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';
  查看全部
安装mysql5.6.25

1.下载安装包:wget http://cdn.mysql.com/archives/ ... ar.gz2. 将mysql解压到/opt/mysql下tar zxvf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz3. 创建一个软链,便于版本升级cd /usr/local/ ln -s /opt/mysql/mysql-5.6.27-linux-glibc2.5-x86_64 mysql4. 创建MySQL启动用户groupadd mysql useradd -g mysql -s /sbin/nologin -d /usr/local/mysql mysql
chown -R mysql:mysql /usr/local/mysql5. 创建基本的目录mkdir -p /data/mysql/mysql3306/{data,logs,tmp} chown -R mysql:mysql /data/mysql/mysql33066. 创建/etc/my.cnf配置文件(见附件)[root@localhost mysql]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/mysql3306/data
socket=/tmp/mysql.sock
user=mysql
port = 3306

symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
port = 3306
socket = /tmp/mysql.sock7. 做MySQL初始化cd /usr/local/mysql ./scripts/mysql_install_db8. 创建一个启动脚本cp support-files/mysql.server /etc/init.d/mysql9. 启动和关闭/etc/init.d/mysql start|stop|restart


[root@localhost mysql]# /etc/init.d/mysql start

Starting MySQL..                                           [确定]

[root@localhost mysql]# /etc/init.d/mysql stop

Shutting down MySQL..                                      [确定]

10.设置环境变量

[root@localhost mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

[root@localhost mysql]# source /etc/profile

11.进入数据库

mysql

安装jemalloc库

wget http://www.canonware.com/downl ... r.bz2
tar jxvf jemalloc-3.4.1.tar.bz2
cd jemalloc-3.4.1
./configure --prefix=/usr/local/jemalloc-3.4.1
make && make install
ldconfig#配置文件
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
plugin-dir = /usr/local/mysql/lib/mysql/plugin
malloc-lib= /usr/local/jemalloc-3.4.1/lib/libjemalloc.so
plugin-load=ha_tokudb.so
#安装tokudb
1.解压
[root@localhost software]# tar -zxf Percona-Server-5.6.25-rel73.1-TokuDB.Linux.x86_64.ssl101.tar.gz
2.解压后目录如下
[root@localhost Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101]# ls
bin  lib  mysql-test  README-TOKUDB
3. 把相关目录放到BASEDIR下
[root@localhost software]# cp -r Percona-Server-5.6.25-rel73.1-Linux.x86_64.ssl101/* /usr/local/mysql
4.启动之前,停用transparent huge pages
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
[root@localhost software]# echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
5.启动数据库,并进入数据库
[root@localhost software]# /etc/init.d/mysql start
Starting MySQL..                                           [确定]
[root@localhost software]# mysql
6.手动添加plugin
INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';
 

Innodb表select查询顺序不对的思考

MySQLwubx 发表了文章 • 1 个评论 • 283 次浏览 • 2016-12-31 09:34 • 来自相关话题

今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:

CREATE TABLE `zst_t1` (

`uid` int(10) NOT NULL AUTO_INCREMENT,

`id` int(11) NOT NULL,

PRIMARY KEY (`uid`),

KEY `idx_id` (`id`)

) ENGINE=InnoDB;’

写入数据:

INSERT INTO `zst_t1` VALUES (1,1),(12,1),(22,1),(23,1),(33,1),(2,2),(3,2),(10,2),(11,2),(4,4),(13,4),(14,4);

执行查询:

select * from zst_t1;







为什么这个顺序是乱的,不按顺序排列呢?难道Innodb表并不是全按主键存储?

使用innodb_ruby这个工具查看一下存储结构什么样







看样子存储还是按主键排序存储的。没毛病。

再来看一下该表的索引:






看到这里应该明白了怎么会事了吧,原来这个查询是走的索引覆盖,没有在进行回表读取原数据。另外,也在此说明,Innodb二索索引包含了主键存储。

来继续证明一下:







看到using index 吧,表示这个查询利用索引查询出来结果,不用读取原表。

那么我们给造一个通过主键读取数据操作:

select * from zst_t1 use index(primary);






select * from zst_t1 use index(primary); 
 #确认一下。






总结:

这个其实就是一个索引包含的查询案例。 如果静下来思考一下,也许很快就明白了。也不用这样去查问题。

技术在于折腾,多搞搞就明白了:)。 查看全部
今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:

CREATE TABLE `zst_t1` (

`uid` int(10) NOT NULL AUTO_INCREMENT,

`id` int(11) NOT NULL,

PRIMARY KEY (`uid`),

KEY `idx_id` (`id`)

) ENGINE=InnoDB;’

写入数据:

INSERT INTO `zst_t1` VALUES (1,1),(12,1),(22,1),(23,1),(33,1),(2,2),(3,2),(10,2),(11,2),(4,4),(13,4),(14,4);

执行查询:

select * from zst_t1;

1.png



为什么这个顺序是乱的,不按顺序排列呢?难道Innodb表并不是全按主键存储?

使用innodb_ruby这个工具查看一下存储结构什么样

2.png



看样子存储还是按主键排序存储的。没毛病。

再来看一下该表的索引:

3.png


看到这里应该明白了怎么会事了吧,原来这个查询是走的索引覆盖,没有在进行回表读取原数据。另外,也在此说明,Innodb二索索引包含了主键存储。

来继续证明一下:

4.png



看到using index 吧,表示这个查询利用索引查询出来结果,不用读取原表。

那么我们给造一个通过主键读取数据操作:

select * from zst_t1 use index(primary);

5.png


select * from zst_t1 use index(primary); 
 #确认一下。

6.png


总结:

这个其实就是一个索引包含的查询案例。 如果静下来思考一下,也许很快就明白了。也不用这样去查问题。

技术在于折腾,多搞搞就明白了:)。

Mongodb的sharding模式实战

mongodbzhangdh 发表了文章 • 0 个评论 • 30 次浏览 • 2016-12-30 14:12 • 来自相关话题

Sharding模式结构图:

下面是安装配置实例的系统说明(8台机器,4个分片):

注意:上表中颜色相同的代表在同一台服务器上,其实也可以每个成员单放一台机器,但是比如像arbiter(仲裁节点),configserver(配置服务器),mongos(路由)本身消耗资源不是很大,可以复用,但是一台服务器最好只运行一个mongod。所以我们采用的一台服务器只运行了一个mongod和1至2个其他组成员,注意,一台服务器上不要运行同一组的多个成员,这样就起不到冗余的作用了。

//shard1

10.0.0.28 10.0.0.26

# sudo mkdir -p /var/soft/data/shard1

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard1 –bind_ip 0.0.0.0 –port 27040 –dbpath /var/soft/data/shard1/ -logpath /var/soft/log/shard1.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
10.0.0.30

# sudo mkdir -p /var/soft/data/arbiter1/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard1 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter1/ -logpath /var/soft/log/arbiter1.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.26 上执行

> config = {_id: ‘shard1’, members: [{_id: 0, host: ‘mongodb26:27040’}, {_id: 1, host: ‘mongodb28:27040’},{_id: 2, host: ‘mongodb30:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard2

10.0.0.30 10.0.0.31

# sudo mkdir -p /var/soft/data/shard2

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard2 –bind_ip 0.0.0.0 –port 27050 –dbpath /var/soft/data/shard2/ -logpath /var/soft/log/shard2.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 在10.0.0.32上执行

# sudo mkdir -p  /var/soft/data/arbiter2/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard2 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter2/ -logpath /var/soft/log/arbiter2.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.31 上执行

> config = {_id: ‘shard2’, members: [{_id: 0, host: ‘mongodb30:27050’}, {_id: 1, host: ‘mongodb31:27050’},{_id: 2, host: ‘mongodb32:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard3

10.0.0.32 10.0.0.33

# sudo mkdir -p /var/soft/data/shard3

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard3 –bind_ip 0.0.0.0 –port 27060 –dbpath /var/soft/data/shard3/ -logpath /var/soft/log/shard3.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
在 10.0.0.34上执行

# sudo mkdir -p  /var/soft/data/arbiter3/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard3 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter3/ -logpath /var/soft/log/arbiter3.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.33 上执行

> config = {_id: ‘shard3’, members: [{_id: 0, host: ‘mongodb32:27060’}, {_id: 1, host: ‘mongodb33:27060’},{_id: 2, host: ‘mongodb34:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard4

10.0.0.34 10.0.0.35

# sudo mkdir -p /var/soft/data/shard4

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard4 –bind_ip 0.0.0.0 –port 27070 –dbpath /var/soft/data/shard4/ -logpath /var/soft/log/shard4.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
在10.0.0.26上执行

# sudo mkdir -p  /var/soft/data/arbiter4/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard4 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter4/ -logpath /var/soft/log/arbiter4.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.35 上执行

> config = {_id: ‘shard4’, members: [{_id: 0, host: ‘mongodb34:27070’}, {_id: 1, host: ‘mongodb35:27070’},{_id: 2, host: ‘mongodb26:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//配置configserver:

在10.0.0.28 10.0.0.33 10.0.0.35

# sudo mkdir -p /var/soft/data/config

# sudo mkdir -p /var/soft/log/config

# /var/soft/mongodb2.2/bin/mongod –bind_ip 0.0.0.0 –fork –configsvr –port 20000 –dbpath /var/soft/data/config –logpath /var/soft/log/config/config.log –logappend

 
// 添加mongos

# sudo mkdir -p /var/soft/log/mongos

在10.0.0.30上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 
在10.0.0.28上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 
在10.0.0.32上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 在 10.0.0.30上执行

# /var/soft/mongodb2.2/bin/mongo  –port 30000

> db.runCommand({addshard : “shard1/mongodb26:27040,mongodb28:27040″,name:”shard1”,maxsize:504800});

> db.runCommand({addshard : “shard2/mongodb30:27050,mongodb31:27050″,name:”shard2”,maxsize:504800});

> db.runCommand({addshard : “shard3/mongodb32:27060,mongodb33:27060″,name:”shard3”,maxsize:504800});

> db.runCommand({addshard : “shard4/mongodb34:27070,mongodb35:27070″,name:”shard4”,maxsize:504800});

>db.runCommand( { listshards : 1 } )

如果列出了以上四个你加的shards,表示shards已经配置成功

> db.printShardingStatus();

 
按研发人员要求建立shard:

# /var/soft/mongodb2.2/bin/mongos –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

> db.runCommand( { movePrimary: “recsys0”, to: “shard1” })

> db.runCommand( { movePrimary: “recsys1”, to: “shard2” })

> db.runCommand( { movePrimary: “recsys2”, to: “shard3” })

> db.runCommand( { movePrimary: “recsys3”, to: “shard4” })


分片设置:

对于我们公司来说,我们使用的手动分片,不是auto-sharding,所以也不需要执行类似db.runCommand({enablesharding:库名})这样的命令。我们只是在4个不同的shard上建立4个库。至于读写操作会对应哪个库,由程序来判断。

那么建库的时候要登陆mongos来建,建好一个库,mongos来自动给你分配是建立在哪个shard上,但是如果你对自动分配的shard不满意可以运行命令来把它移动到别的shard上。

例如:我在mongos上建立了一个库叫recsys0库。运行db.printShardingStatus()命令我们可以看到这个recsys0是建到了哪个shard,如果建到了shard4,你觉得不满意,你想改到shard1,那么可以运行命令,db.runCommand( { movePrimary: “recsys0”, to: “shard1” }),这个库就会从shard4挪到shard1上。可通过db.printShardingStatus()再次检查。

 维护方面:

每个分片是一个replica set复制集,所以问题的处理与之前的replica set篇相同。

 出现过的问题:

Recsys1库明明配置的是在shard2上,但是shard1上也写入了少量数据,比较奇怪,于是在shard1用mongosniff –source NET eth0 –port 27040来抓取query,看看写入Recsys1库的query来自于哪里,于是发现是来自于一个mongos,其他的mongos均正常,这台mongos直接use Recsys1就进入的是shard1,但是执行db.printShardingStatus()没发现异常,怀疑是bug,结果关闭了这台mongos服务,解决问题。
  查看全部
Sharding模式结构图:

下面是安装配置实例的系统说明(8台机器,4个分片):

注意:上表中颜色相同的代表在同一台服务器上,其实也可以每个成员单放一台机器,但是比如像arbiter(仲裁节点),configserver(配置服务器),mongos(路由)本身消耗资源不是很大,可以复用,但是一台服务器最好只运行一个mongod。所以我们采用的一台服务器只运行了一个mongod和1至2个其他组成员,注意,一台服务器上不要运行同一组的多个成员,这样就起不到冗余的作用了。

//shard1

10.0.0.28 10.0.0.26

# sudo mkdir -p /var/soft/data/shard1

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard1 –bind_ip 0.0.0.0 –port 27040 –dbpath /var/soft/data/shard1/ -logpath /var/soft/log/shard1.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
10.0.0.30

# sudo mkdir -p /var/soft/data/arbiter1/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard1 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter1/ -logpath /var/soft/log/arbiter1.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.26 上执行

> config = {_id: ‘shard1’, members: [{_id: 0, host: ‘mongodb26:27040’}, {_id: 1, host: ‘mongodb28:27040’},{_id: 2, host: ‘mongodb30:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard2

10.0.0.30 10.0.0.31

# sudo mkdir -p /var/soft/data/shard2

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard2 –bind_ip 0.0.0.0 –port 27050 –dbpath /var/soft/data/shard2/ -logpath /var/soft/log/shard2.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 在10.0.0.32上执行

# sudo mkdir -p  /var/soft/data/arbiter2/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard2 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter2/ -logpath /var/soft/log/arbiter2.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.31 上执行

> config = {_id: ‘shard2’, members: [{_id: 0, host: ‘mongodb30:27050’}, {_id: 1, host: ‘mongodb31:27050’},{_id: 2, host: ‘mongodb32:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard3

10.0.0.32 10.0.0.33

# sudo mkdir -p /var/soft/data/shard3

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard3 –bind_ip 0.0.0.0 –port 27060 –dbpath /var/soft/data/shard3/ -logpath /var/soft/log/shard3.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
在 10.0.0.34上执行

# sudo mkdir -p  /var/soft/data/arbiter3/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard3 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter3/ -logpath /var/soft/log/arbiter3.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.33 上执行

> config = {_id: ‘shard3’, members: [{_id: 0, host: ‘mongodb32:27060’}, {_id: 1, host: ‘mongodb33:27060’},{_id: 2, host: ‘mongodb34:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//shard4

10.0.0.34 10.0.0.35

# sudo mkdir -p /var/soft/data/shard4

# sudo mkdir -p /var/soft/log

# sudo  /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard4 –bind_ip 0.0.0.0 –port 27070 –dbpath /var/soft/data/shard4/ -logpath /var/soft/log/shard4.log –logappend –nojournal –oplogSize=4096 –fork –noprealloc

 
在10.0.0.26上执行

# sudo mkdir -p  /var/soft/data/arbiter4/

# sudo mkdir -p /var/soft/log

# /var/soft/mongodb2.2/bin/mongod –shardsvr –replSet shard4 –bind_ip 0.0.0.0 –port 27000 –dbpath /var/soft/data/arbiter4/ -logpath /var/soft/log/arbiter4.log –logappend –nojournal –oplogSize=4096 –fork

 
在10.0.0.35 上执行

> config = {_id: ‘shard4’, members: [{_id: 0, host: ‘mongodb34:27070’}, {_id: 1, host: ‘mongodb35:27070’},{_id: 2, host: ‘mongodb26:27000’, arbiterOnly: true}]}

> rs.initiate(config);

 
//配置configserver:

在10.0.0.28 10.0.0.33 10.0.0.35

# sudo mkdir -p /var/soft/data/config

# sudo mkdir -p /var/soft/log/config

# /var/soft/mongodb2.2/bin/mongod –bind_ip 0.0.0.0 –fork –configsvr –port 20000 –dbpath /var/soft/data/config –logpath /var/soft/log/config/config.log –logappend

 
// 添加mongos

# sudo mkdir -p /var/soft/log/mongos

在10.0.0.30上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 
在10.0.0.28上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 
在10.0.0.32上执行

# /var/soft/mongodb2.2/bin/mongos  –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

 在 10.0.0.30上执行

# /var/soft/mongodb2.2/bin/mongo  –port 30000

> db.runCommand({addshard : “shard1/mongodb26:27040,mongodb28:27040″,name:”shard1”,maxsize:504800});

> db.runCommand({addshard : “shard2/mongodb30:27050,mongodb31:27050″,name:”shard2”,maxsize:504800});

> db.runCommand({addshard : “shard3/mongodb32:27060,mongodb33:27060″,name:”shard3”,maxsize:504800});

> db.runCommand({addshard : “shard4/mongodb34:27070,mongodb35:27070″,name:”shard4”,maxsize:504800});

>db.runCommand( { listshards : 1 } )

如果列出了以上四个你加的shards,表示shards已经配置成功

> db.printShardingStatus();

 
按研发人员要求建立shard:

# /var/soft/mongodb2.2/bin/mongos –port 30000 –configdb mongodb28:20000,mongodb33:20000,mongodb35:20000 –logpath /var/soft/log/mongos/mongos.log –logappend –fork

> db.runCommand( { movePrimary: “recsys0”, to: “shard1” })

> db.runCommand( { movePrimary: “recsys1”, to: “shard2” })

> db.runCommand( { movePrimary: “recsys2”, to: “shard3” })

> db.runCommand( { movePrimary: “recsys3”, to: “shard4” })


分片设置:

对于我们公司来说,我们使用的手动分片,不是auto-sharding,所以也不需要执行类似db.runCommand({enablesharding:库名})这样的命令。我们只是在4个不同的shard上建立4个库。至于读写操作会对应哪个库,由程序来判断。

那么建库的时候要登陆mongos来建,建好一个库,mongos来自动给你分配是建立在哪个shard上,但是如果你对自动分配的shard不满意可以运行命令来把它移动到别的shard上。

例如:我在mongos上建立了一个库叫recsys0库。运行db.printShardingStatus()命令我们可以看到这个recsys0是建到了哪个shard,如果建到了shard4,你觉得不满意,你想改到shard1,那么可以运行命令,db.runCommand( { movePrimary: “recsys0”, to: “shard1” }),这个库就会从shard4挪到shard1上。可通过db.printShardingStatus()再次检查。

 维护方面:

每个分片是一个replica set复制集,所以问题的处理与之前的replica set篇相同。

 出现过的问题:

Recsys1库明明配置的是在shard2上,但是shard1上也写入了少量数据,比较奇怪,于是在shard1用mongosniff –source NET eth0 –port 27040来抓取query,看看写入Recsys1库的query来自于哪里,于是发现是来自于一个mongos,其他的mongos均正常,这台mongos直接use Recsys1就进入的是shard1,但是执行db.printShardingStatus()没发现异常,怀疑是bug,结果关闭了这台mongos服务,解决问题。