1、备份和恢复 基于LVM的备份 (1) 请求锁定所有表 mysql> FLUSH TABLES WITH READ LOCK; (2) 记录二进制日志文件及事件位置 mysql> FLUSH LOGS; mysql> SHOW MASTER STATUS; mysql -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE (3) 创建快照 lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME (4) 释放锁 mysql> UNLOCK TABLES; (5) 挂载快照卷,执行数据备份 (6) 备份完成后,删除快照卷 (7) 制定好策略,通过原卷备份二进制日志 实验:基于LVM的备份还原 (1)分区 fdisk /dev/sda 改变设置:n、t、8 partprobe centos7上使得分区生效 (2)建立逻辑卷 yum provides 'pvcreate' 看哪个包提供了这个命令 yum install lvm2 安装提供pvcreate命令的包 pvcreate /dev/sda7 创建物理卷 pvs 查看物理卷 vgcreate vg0 /dev/sda7 创建卷组,并将物理卷加入卷组中 vgs pvs lvcreate -n mysqldata -L 2G vg0 从卷组中取2G大小的空间,并指定逻辑卷名为 mysqldata; lvcreate -n binlogs -L 3G vg0 创建逻辑卷 mkfs.xfs /dev/vg0/mysqldata 为逻辑卷创建文件系统 mkfs.xfs /dev/vg0/binlogs blkid 查看 mkdir /data/{mysqldata,binlogs} 创建数据库目录 vim /etc/fstab 编辑文件进行挂载 UUID=cb73f3aa-62cd-429a-9c65-aad2b717f4a7 /data/mysqldata xfs
defaults 0 0 UUID=da772d40-e47b-408b-be94-632158f4dc18 /data/binlogs xfs
defaults 0 0 mount -a 使得挂载生效 (3)分离数据和binlog到各自的逻辑卷 vim /etc/my.cnf datadir=/data/mysqldata socket=/var/lib/mysql/mysql.sock log-bin=/data/binlogs/mysql-bin systemctl restart mariadb 重启服务生效 chown -R mysql.mysql /data/ 设置数据库的属组合属主;要在此步骤之后进行设 置; mysql < /app/hellodb_InnoDB.sql 导入数据库 (4)请求锁定所有表 mysql> FLUSH TABLES WITH READ LOCK; (5)记录二进制日志文件及事件位置 mysql> FLUSH LOGS; 让新旧日志分离开 mysql> SHOW MASTER STATUS; mysql -e 'SHOW MASTER STATUS' > /app/pos.log (6)创建快照 lvcreate -n mysqldata-snapshot -s -p r -L 2G /dev/vg0/mysqldata 创建逻辑卷为 mysqldata的,名字为mysqldata-snapshot,-s为快照,-p指定属性为只读,-L指定大小;在 没有针对原始卷的写操作时,快照保存的是原始卷的元数据,没有物理数据的复制 (7)释放锁 mysql> UNLOCK TABLES; (8)挂载快照卷,执行数据备份 mkdir /mnt/snap mount -o nouuid,norecovery /dev/vg0/mysqldata-snapshot /mnt/snap 由于xfs文件系统 的逻辑卷创建的快照的UUID和逻辑卷的UUID是相同的,所以需要加上选项进行挂载; cp -a /mnt/snap/* /backups/ 原始卷数据没有发生改变时,复制快照就是读取原始卷 的数据,原始卷发生改变时,复制快照就是读取快照数据; (9)备份完成后,删除快照卷 lvremove /dev/vg0/mysqldata-snapshot (10)破坏数据库 systemctl stop mariadb rm -rf /data/mysqldata/* (11)快照备份还原 cp -a /backups/* /data/mysqldata/ (12)binlog还原 cp /data/binlogs/mysql-bin.00000{4,5} /app/ -a mysqlbinlog --start-position=245 mysql-bin.000004 > bin.sql mysqlbinlog mysql-bin.000005 >> bin.sql system start mariadb flush tables with read lock; set sql_log_bin=0; 二进制还原要先将二级制记录停止,因为数据量太大,还原没必要 记录到二进制日志中; MariaDB [(none)]> unlock tables; MariaDB [(none)]>source /app/bin.sql MariaDB [(none)]>>set sql_log_bin=1; 2、xtrabackup Percona 官网:www.percona.com percona-server InnoDB --> XtraDB Xtrabackup percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的 工具 特点: (1)备份还原过程快速、可靠 (2)备份过程不会打断正在执行的事务 (3)能够基于压缩等功能节约磁盘空间和流量 (4)自动实现备份检验 (5)开源,免费 3、xtrabackup Xtrabackup2.2版之前包括4个可执行文件: Innobackupex: perl 脚本 Xtrabackup: C/C++ 编译的二进制 Xbcrypt:加解密 Xbstream:支持并发写的流文件格式 xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表, 和 mysqld server 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还 会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、 获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上做了一层封装实现的; 虽然目前一般不用 MyISAM 表,只是mysql 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行;现在2.4版本则是innobackupex和Xtrabackup是同一个东西(有指向); 4、Xtrabackup备份过程

解释:此工具是通过两个线程进行工作,先是一个线程进行事务日志的拷贝,然后另一个线程进行数据块的拷贝,两个线程在一段时间内同时进行工作,前者先开始后结束;后者结束后加锁,之后MYISAM进行文件的普通拷贝,之后另一线程结束,解锁,用户可以进行访问了;此工具的innodb备份是基于磁盘的数据块进行的; 5、Xtrabackup的新版变化 xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的 变化:innobackupex 功能全部集成到 xtrabackup 里面,只 有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过 xtrabackup替换innobackupex xtrabackup安装: yum install percona-xtrabackup 在EPEL源中 版本低 最新版本下载安装: https://www.percona.com/downloads/XtraBackup/L ATEST/ yum install percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 将下载的rpm包用yum进行安装 注意:Xtrabackup备份时拷贝的是一个文件在磁盘底层的多个数据块;和mysqldump备份是不一样的;因此Xtrabackup性能更好 6、innobakupex备份 使用innobakupex备份时,其会调用xtrabackup备份所有的 InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以 及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex 还会在备份目录中创建如下文件: (1)xtrabackup_checkpoints:备份类型(如完全或增量)、 备份状态(如是否已经为prepared状态)和LSN(日志序列号) 范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志 序列号,即LSN。LSN是整个数据库系统的系统版本号,每 个页面相关的LSN能够表明此页面最近是如何发生改变的 (2)xtrabackup_binlog_info:mysql服务器当前正在使用的 二进制日志文件及至备份这一刻为止二进制日志事件的位置

7、innobakupex备份 (3)xtrabackup_binlog_pos_innodb:二进制日志文件及用于 InnoDB或XtraDB表的二进制日志文件的当前position (4)xtrabackup_binary:备份中用到的xtrabackup的可执行 文件 (5)backup-my.cnf:备份命令用到的配置选项信息 在使用innobackupex进行备份时,还可以使用--notimestamp选项来阻止命令自动创建一个以时间命名的目录 ;innobackupex命令将会创建一个BACKUP-DIR目录来存 储备份数据

8、Xtrabackup用法 备份:innobackupex [option] BACKUP-ROOT-DIR 选项说明: --user:该选项表示备份账号 --password:该选项表示备份的密码 --host:该选项表示备份数据库的地址 --databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔 开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。 如:"mydatabase.mytable"。该选项对innodb引 擎表无效,还是会备份所有innodb表 --defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位 置 --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir --incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量 备份的base目录,与--incremental同时使用 --incremental-dir:该选项表示增量备份的目录 --include=name:指定表名,格式:databasename.tablename 实验1:完全备份的过程信息 rm -rf /backups/* 清理目录 innobackupex --user=root /backups/ 进行全备份 cd /backups/ ls 发现时间为目录名的备份 cd 2018-03-26_21-12-38/ cat xtrabackup_checkpoints 查看备份相关信息 backup_type = full-backuped 表示全备份 from_lsn = 0 从日志序列编号0 to_lsn = 1640698 到编号1640698 实验2:完全,增量备份及还原 (1)在原主机 innobackupex /backups 完全备份 mkdir /backups/inc{1,2} insert students (name,age,gender)values('a',29,'F'); 在完全备份后修改数据 innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02- 23_14-21-42 进行基于完全备份的增量备份 insert students (name,age,gender)values('b',20,'M'); 修改数据 innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02- 23_14-26-17 进行基于上一次增量备份的增量备份 scp -r /backups/ 192.168.27.17:/app/ 将 备份数据复制到要还原的主机 (2)在目标主机 不启动mariadb rm -rf /var/lib/mysql/* innobackupex --apply-log --redo-only /app/backups/2018-02-23_14-21-42/ 整理完全 备份的数据 innobackupex --apply-log --redo-only /app/backups/2018-02-23_14-21-42/ --incremental- dir=/app/backups/inc1/2018-02-23_14-26-17 将第一次增量备份的数据整理到完全备份 中 innobackupex --apply-log --redo-only /app/backups/2018-02-23_14-21-42/ --incremental- dir=/app/backups/inc2/2018-02-23_14-28-29/ 将第二次增量备份的数据整理到完全备份 中 ls /var/lib/mysql/ innobackupex --copy-back /app/backups/2018-02-23_14-21-42/ 还原数据 chown -R mysql.mysql /var/lib/mysql/ 修改属性 systemctl start mariadb 实验3:单表导出和导入 (1)单表备份 innobackupex --include='hellodb.students' /backups (2)单表的定义导出 mysql -e 'show create table hellodb.students' > student.sql 注意只要下面部分 CREATE TABLE students ( StuID int(10) unsigned NOT NULL AUTO_INCREMENT, Name varchar(50) NOT NULL, Age tinyint(3) unsigned NOT NULL, Gender enum('F','M') NOT NULL, ClassID tinyint(3) unsigned DEFAULT NULL, TeacherID int(10) unsigned DEFAULT NULL, PRIMARY KEY (StuID) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 (3)删除表 mysql -e 'drop table hellodb.students' (4)整理表 innobackupex --apply-log --export /backups/2018-02-23_15-03-23/ (5)将单表的定义导入 mysql> CREATE TABLE students ( StuID int(10) unsigned NOT NULL AUTO_INCREMENT, Name varchar(50) NOT NULL, Age tinyint(3) unsigned NOT NULL, Gender enum('F','M') NOT NULL, ClassID tinyint(3) unsigned DEFAULT NULL, TeacherID int(10) unsigned DEFAULT NULL, PRIMARY KEY (StuID) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 (6)删除表空间 alter table students discard tablespace; (7)复制除了表定义文件外的其他3个文件 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/ (8)更改属性 chown -R mysql.mysql /var/lib/mysql/hellodb/ (9)将表空间导入 mysql>alter table students import tablespace; (10)查询发现表被导入了 mysql>select * from students; 注意:单表导出与导入需要安装新版本的mariadb,可以用官网的仓库进行安装 9、Xtrabackup用法 Prepare:innobackupex --apply-log [option] BACKUP-DIR 选项说明: --apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复 操作,因为备份的数据中可 能会包含尚未提交的事务或已经提交但 尚未同步至数据文件中的事务。因此,此时数据文件 仍处理不一致 状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务 至数据文 件使数据文件处于一致性状态 --use-memory:该选项表示和--apply-log选项一起使用, prepare 备份的时候,xtrabackup 做crash recovery分配的内存 大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G --defaults-file:该选项指定了从哪个文件读取MySQL配置,必 须放在命令行第一个选项的位 置 --export:表示开启可导出单独的表之后再导入其他Mysql中 --redo-only:这个选项在prepare base full backup,往其中 merge增量备份时候使用

10、Xtrabackup用法 还原: innobackupex --copy-back [选项] BACKUP-DIR innobackupex --move-back [选项] [--defaultsgroup=GROUP-NAME] BACKUP-DIR 选项说明: --copy-back:做数据恢复时将备份数据文件拷贝到MySQL 服务器的datadir --move-back:这个选项与--copy-back相似,唯一的区别 是它不拷贝文件,而是移动文件到 目的地。这个选项移除 backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同 事保留数据文件和Backup副本 实验1:完全备份及还原 (1)在原主机 innobackupex --user=root /backups 进行完全备份 scp -r /backups/2018-02-23_11-55-57/ 192.168.27.17:/app/ 复制到另一主机

(2) 在目标主机 innobackupex --apply-log /app/2018-02-23_11-55-57/ 整理 systemctl stop mariadb rm -rf /var/lib/mysql/* innobackupex --copy-back /app/2018-02-23_11-55-57/ 复制 chown -R mysql.mysql /var/lib/mysql/ 设置属性 systemctl start mariadb

11、Xtrabackup用法 还原注意事项: 1.datadir目录必须为空。除非指定innobackupex --forcenon-empty-directorires选项指定,否 则--copy-backup选项不会覆盖 2.在restore之前,必须shutdown MySQL实例,你不能将一个 运行中的实例restore到datadir 目录中 3.由于文件属性会被保留,大部分情况下你需要在启动实例之前 将文件的属主改为mysql, 这些文件将属于创建备份的用户 chown -R mysql:mysql /data/mysql 以上需要在用户调用 innobackupex之前完成 --force-non-empty-directories:指定该参数时候,使得 innobackupex -- copy-back或--move-back选项转移文件到非 空目录,已存在的文件不会被覆盖。如果--copy- back和-- move-back文件需要从备份目录拷贝一个在datadir已经存在的 文件,会报错失败

12、MySQL复制 扩展方式: Scale Up ,Scale Out MySQL的扩展复制: 每个节点都有相同的数据集 向外扩展 二进制日志 主上打开 单向 主向从,也可以主主双向 复制的功用: 数据分布 负载均衡读 备份 将从变成主 高可用和故障切换 MySQL升级测试 从测试成功后再给主进行升级 13、MySQL复制

注意:一般来说,视频和图片是不放在数据库里的,它们放在磁盘上,数据库里只是存储它们的存放磁盘的路径;主服务器负责接收写的请求,进行写操作,而从服务器只负责读请求,进行读操作;主从复制数据是异步的,不是同步的,因此用户的请求体验不是很好; 14、MySQL复制

15、MySQL垂直分区

16、MySQL水平分片(Sharding)

17、对应shard中查询相关数据

18、MySQL复制 主从复制线程: 主节点: dump Thread:为每个Slave的I/O Thread启动一个dump线程 ,用于向其发送binary log events; 自动启动此线程 从节点: I/O Thread:向Master请求二进制日志事件,并保存于从节点的中继日志文件中 SQL Thread:从中继日志中读取日志事件,在本地完成重放 注意:从节点上的两个线程第一次需要手动启动 跟复制功能相关的文件: master.info:用于保存slave连接至master时的相关信息,例如 账号、密码、服务器地址等 relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的 对应关系;

19、MySQL复制 主从复制特点: 异步复制 主从数据不一致比较常见 复制架构: Master/Slave, Master/Master, 环状复制 一主多从 从服务器还可以再有从服务器 一从多主:适用于多个不同数据库 从上有多个数据库实例
复制要考虑二进制日志事件记录格式 STATEMENT(5.0之前)、ROW(5.1之后,推荐)、MIXED 注意:基于语句的记录可能受到函数的影响如now();时时刻刻都在变,恢复时不一致; 各种复制模型实战: 主从、主主、半同步复制、复制过滤器 注意:同步复制是指在主服务器更改数据后必须同步到从服务器才算完成;而异步是主服务器完 成就行,从慢慢搞;半同步则是指在主服务器更改数据后从服务器有一台完成数据的复制就行, 其他的慢慢搞;复制过滤器是挑选一些数据库进行复制;

20、MySQL复制模型

注意:master-->slave-->slaves模型采用了 BLACKHOLE引擎(只中转复制而不会存储) 21、MySQL复制 主从配置过程: 参看: https://mariadb.com/kb/en/library/setting-up-replication/ https://dev.mysql.com/doc/refman/5.5/en/replicationconfiguration.html 主节点: (1) 启动二进制日志 [mysqld] log_bin=mysql-bin (2) 为当前节点设置一个全局惟的ID号 [mysqld] server_id=# (3) 创建有复制权限的用户账号 GRANT REPLCATION SLAVE ON . TO 'repluser'@'HOST' IDENTIFIED BY 'replpass'; 22、MySQL复制 从节点配置: (1) 启动中继日志 [mysqld] server_id=# 为当前节点设置一个全局惟的ID号 默认为0 relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin 会自动生成 relay_log_index=relay-log.index 默认值hostname-relay-bin.index 自动生成 (2) 使用有复制权限的用户账号连接至主服务器,并启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.xxxxx', MASTER_LOG_POS=#; mysql> START SLAVE [IO_THREAD|SQL_THREAD]; 注意:主从复制需要关闭防火墙和安全机制

实验:主从复制 A机器:master IP为172.18.62.60 [mysqld] innodb_file_per_table 可选 log-bin server_id=1 mysql>show master logs; mysql> grant replication slave on . to repluser@'172.18.62.%' identified by '123789'; 授权 复制;

B机器:slave IP为172.18.62.61 [mysqld] innodb_file_per_table 可选 read-only 可选 server_id=2 systemctl restart mariadb CHANGE MASTER TO MASTER_HOST='172.18.62.60', MASTER_USER='repluser', MASTER_PASSWORD='123789', MASTER_LOG_FILE='mariadb-bin.000002', 查看主服务器知道的 MASTER_LOG_POS=245;

start slave; show slave status\G; 可测试:主变,从就变 注意:此实验先要关闭防火墙和安全机制

23、MySQL复制 如果主节点已经运行了一段时间,且有大量数据时,如何配置 并启动slave节点 通过备份恢复数据至从服务器 复制起始位置为备份时,二进制日志文件及其POS 不能使用在备份文件中的日志和位 置,应该和之前的主从复制的使用相同,否则不能正确同步; 如果要启用级联复制,需要在从服务器启用以下配置 [mysqld] log_bin 记录本身从服务器的自身的改变,不记录来自于主服务器对第一从 服务器的更改; log_slave_updates 第一个从服务器把主服务器的更改应用到他的二进制日志 实验1:主节点数据量大,现在才开始设置主从复制 A机器:master IP为172.18.62.60 [mysqld] innodb_file_per_table 可选 log-bin server_id=1 mysql>show master logs; mysql> grant replication slave on . to repluser@'172.18.62.%' identified by '123789'; 授权 复制; mysqldump -A -F --single-transaction --master-data=1 > /app/all1.sql 备份,里面有主从复 制的开始位置语句,但是不管它,另外再搞; scp /app/all1.sql 172.18.62.61:/app

B机器:slave IP为172.18.62.61 [mysqld] innodb_file_per_table 可选 read-only 可选 server_id=2 systemctl stop mariadb rm -rf /var/lib/mysql/* systemctl restart mariadb mysql < /app/all1.sql CHANGE MASTER TO MASTER_HOST='172.18.62.60', MASTER_USER='repluser', MASTER_PASSWORD='123789', MASTER_LOG_FILE='mariadb-bin.000002', 后两项不能使用备份文件中的 MASTER_LOG_POS=245;

start slave; show slave status\G; show databases;

实验2:级联复制即主从从复制 A机器:master IP为172.18.62.60 [mysqld] innodb_file_per_table 可选 log-bin server_id=1 mysql>show master logs; 查看此时日志的起始位置,以便从服务器知道从哪开始复制 mysql> grant replication slave on . to repluser@'192.168.27.%' identified by 'centos'; 授权 复制;

B机器:slave IP地址为172.18.62.61 [mysqld] innodb_file_per_table 可选 read-only 可选 server_id=2 log_slave_updates log-bin show master logs; CHANGE MASTER TO MASTER_HOST='172.18.62.60', MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', 前面查看到的结果 MASTER_LOG_POS=245;

start slave; 开启io线程和SQL线程 show slave status; 查看主从复制是否成功

C机器:slave's IP为172.18.62.62 [mysqld] innodb_file_per_table 可选 read-only 可选 server-id=3 CHANGE MASTER TO MASTER_HOST='172.18.62.61', MASTER_USER='repluser', MASTER_PASSWORD='123789', MASTER_LOG_FILE='mariadb-bin.000001', 前面查看到的结果 MASTER_LOG_POS=245;

start slave; 24、MySQL复制 复制架构中应该注意的问题: 1、限制从服务器为只读 在从服务器上设置read_only=ON 注意:此限制对拥有SUPER权限的用户均无效 阻止所有用户, 包括主服务器复制的更新: mysql> FLUSH TABLES WITH READ LOCK; 一般不这样加,因为不能主从复 制就使用没有意义了;

25、MySQL复制 2、如何保证主从复制的事务安全 参看https://mariadb.com/kb/en/library/server-system-variables/ 在master节点启用参数: sync_binlog=1 每次写后立即同步二进制日志到磁盘,性能差 如果用到的为InnoDB存储引擎: innodb_flush_logs_at_trx_commit=1 每次事务提交立即同步日志写磁盘 innodb_support_xa=ON 默认值,分布式事务MariaDB10.3.0废除 sync_master_info=# 多少次事件后master.info同步到磁盘 在slave节点启用服务器选项: --skip_slave_start=ON 不自动启动slave 在slave节点启用参数: sync_relay_log=# #次写后同步relay log到磁盘 sync_relay_log_info=# 多个次事务后同步relay-log.info到磁盘 备份总结: (1)使用mysqldump工具进行备份,适用于中小型的数据 (2)使用innobackupex工具进行备份,innodb引擎的基于块数据的备份,效率高 (3)通过复制文件进行备份 冷备:停止服务,进行文件的拷贝 快照后,复制快照文件 近似热备

26、主主复制 主主复制:互为主从 容易产生的问题:数据不一致;因此慎用 考虑要点:自动增长id 配置一个节点使用奇数id auto_increment_offset=1 开始点 auto_increment_increment=2 增长幅度 另一个节点使用偶数id auto_increment_offset=2 auto_increment_increment=2 注意:如果两个主服务器同时在表中插入一条记录,id号可能会相同但内容不同,此时在主主复 制时就会发生冲突;所以就采用了上面的方法;插入的是紧跟着最后的奇数或偶数,而不是各自 插各自的;

27、主主复制 主主复制的配置步骤: (1) 各节点使用一个惟一server_id (2) 都启动binary log和relay log (3) 创建拥有复制权限的用户账号 (4) 定义自动增长id字段的数值范围各为奇偶 (5) 均把对方指定为主节点,并启动复制线程 实验:主主复制 (1)node1 IP为172.18.62.60 [mysqld] log-bin server_id=1 auto_increment_offset=1 auto_increment_increment=2 innodb_file_per_table systemctl restart mariadb mysql < hellodb_InnoDB.sql mysqldump -A -F --single-transaction --master-data=1 > /app/all.sql show master logs scp /app/all.sql 172.18.62.61:/app grant replication slave on . to repluser@'192.168.27.%' identified by 'centos'; CHANGE MASTER TO MASTER_HOST='192.168.27.17',MASTER_USER='repluser',MASTER_PASSWORD='cen tos',MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=522555; start slave; (2)node2 [mysqld] log-bin server_id=2 auto_increment_offset=2 auto_increment_increment=2 innodb_file_per_table systemctl start mariadb mysql < /app/all.sql show master logs grant replication slave on . to repluser@'192.168.27.%' identified by 'centos'; CHANGE MASTER TO MASTER_HOST='192.168.27.7',MASTER_USER='repluser',MASTER_PASSWORD='cent os',MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=245; start slave; 注意:必须关闭安全机制和防火墙,否则不能实现 28、半同步复制 默认情况下,MySQL的复制功能是异步的,异步复制可以提 供最佳的性能,主库把binlog日志发送给从库即结束,并不验 证从库是否接收完毕。这意味着当主服务器或从服务器端发生 故障时,有可能从服务器没有接收到主服务器发送过来的 binlog日志,这就会造成主服务器和从服务器的数据不一致, 甚至在恢复时造成数据的丢失

29、半同步复制 半同步复制实现: 主服务器配置: mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1; mysql> SHOW GLOBAL VARIABLES LIKE '%semi%'; mysql> SHOW GLOBAL STATUS LIKE '%semi%‘; 从服务器配置: mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1; rpl_semi_sync_master_timeout=10000 单位是毫秒,超时时间,超过就说已经成功, 但实际上还没有成功,有延迟; 实验:半同步复制 (1)正常搭建主从A、B (2)A机器额外加 help install plugin; 查看安装插件的命令帮助 rpm -ql mariadb-server|grep semisync 查看插件的名称 install plugin rpl_semi_sync_master soname'semisync_master.so'; 安装主插件 show plugins; 查看插件是否安装成功 show global variables like '%semi%'; 查看插件的状态信息 set global rpl_semi_sync_master_enabled=on; 打开插件 start slave; show global status like '%semi%'; 查看状态信息 (3)B机器额外加 install plugin rpl_semi_sync_slave soname'semisync_slave.so'; 安装从插件 set global rpl_semi_sync_slave_enabled=on 打开插件 start slave; 开启半同步复制 注意:一个从是半同步,其他从都不是;

30、MySQL复制 复制过滤器: 让从节点仅复制变化数据库中指定的数据库,或指定数据库的指定表 两种实现方式: (1) 主服务器仅向二进制日志中记录与特定数据库(特定表)相关的事件 问题:时间还原无法实现;不建议使用 binlog_do_db= 数据库白名单列表,用逗号分隔 binlog_ignore_db= 数据库黑名单列表,和前项不要同时使用 此方法不好,因为这样就不能进行备份了 (2) 从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相 关的事件并应用于本地;推荐使用 问题:会造成网络及磁盘IO浪费 31、MySQL复制 复制过滤器从服务器上的相关设置 第二种方法 replicate_do_db= 指定复制库的白名单 replicate_ignore_db= 指定复制库黑名单 replicate_do_table= 指定复制表的白名单 replicate_ignore_table= 指定复制表的黑名单 replicate_wild_do_table= foo%.bar% 支持通配符 以foo开头的数据库,以bar开头的表 replicate_wild_ignore_table= 实验: (1)正常搭建主从复制 (2)第二种方法,从中继日志中挑选 配置从服务器即可 vim /etc/my.cnf [mysqld] replicate_do_db=hellodb innodb_file_per_table server_id=2 systemctl restart mariadb 经测试只能同步hellodb中的数据 (3)跳过(2),直接开始此第一种方法(主服务器不记录日志) vim /etc/my.cnf [mysqld] binlog_ignore_db=mysql binlog_format=row systemctl restart mariadb 经测试当二级制日志的记录格式为row时,不使用use语句就可以不同步此mysql数据 库;当二级制日志的记录格式为statement时,需要use语句进入数据库,在数据库内测 试才会达到不同步的目的;从官方文档中可以查到; 注意:vim /lib/systemd/system/mariadb.service 可以查看选项相关的位置 32、MySQL复制加密 基于SSL复制: 在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文 的,外网里访问数据或则复制, 存在安全隐患。通过SSL/TLS加密的方式进行复制的方法,来进 一步提高数据的安全性 配置实现: 参看:https://mariadb.com/kb/en/library/replication-withsecure-connections/ 主服务器开启SSL:[mysqld] 加一行ssl master配置证书和私钥;并且创建一个要求必须使用SSL连接的复制账号 slave端使用CHANGER MASTER TO 命令时指明ssl相关选项

33、MySQL复制加密 Master配置 [mysqld] log-bin server_id=1 ssl ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/master.crt ssl-key=/etc/my.cnf.d/ssl/master.key

34、MySQL复制加密 Slave配置 mysql>CHANGE MASTER TO MASTER_HOST='MASTERIP', MASTER_USER='rep', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245, MASTER_SSL=1, MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem', MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt', MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key'; 注意:show variables like '%ssl%'; 命令显示出来的have_openssl值为NO,那么数据库就要先进 行源码编译才能使用加密功能; 实验:主从复制SSL加密

(1)CA颁发证书 mkdir /etc/my.cnf.d/ssl cd /etc/my.cnf.d/ssl openssl genrsa 2048 > cakey.pem ca生成私钥 chmod 600 cakey.pem 更改属性以安全 openssl req -new -x509 -key cakey.pem -days 3650 -out cacert.pem ca生成自签名 证书; openssl req -newkey rsa:1024 -days 365 -nodes -keyout master.key > master.csr master生成自己的私钥和申请证书的请求; openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt ca给master颁发证书; openssl req -newkey rsa:1024 -days 365 -nodes -keyout slave.key > slave.csr slave生成自己的私钥和申请证书的请求; openssl x509 -req -in slave.csr -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt ca给slave颁发证书; openssl verify -CAfile cacert.pem master.crt slave.crt 检查颁发的证书是否合格 scp -r /etc/my.cnf.d/ssl/ 192.168.27.17:/etc/my.cnf.d/ 将所有证书复制到master供选 择; scp -r /etc/my.cnf.d/ssl/ 192.168.27.27:/etc/my.cnf.d/ 将所有证书复制到slave供选择 (2)master vim /etc/my.cnf log-bin server_id=1 innodb_file_per_table ssl ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/master.crt ssl-key=/etc/my.cnf.d/ssl/master.key systemctl restart mariadb mysql>grant replication slave on . to repluser@'192.168.27.%' identified by 'centos' require ssl;

(3)slave vim /etc/my.cnf server_id=2 innodb_file_per_table ssl systemctl restart mariadb mysql>CHANGE MASTER TO MASTER_HOST='192.168.27.17', MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=821, MASTER_SSL=1, MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem', MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt', MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key'; start slave; show slave status\G; 显示状态 mysql --ssl-ca=/etc/my.cnf.d/ssl/cacert.pem --ssl-cert=/etc/my.cnf.d/ssl/slave.crt -- ssl-key=/etc/my.cnf.d/ssl/slave.key -h172.18.62.61 -urepluser -p123789 可以测试是否 ssl加密成功; 注意:从服务器配置的最后3项可以替换到/etc/my.cnf中为: ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ssl-cert=/etc/my.cnf.d/ssl/master.crt ssl-key=/etc/my.cnf.d/ssl/master.key

35、MySQL复制 复制的监控和维护: (1) 清理日志 PURGE help purge 查看帮助 reset master; 还原日志到起点 PURGE BINARY LOGS TO 'mysql-bin.010'; PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26'; (2) 复制监控 SHOW MASTER STATUS SHOW BINLOG EVENTS SHOW BINARY LOGS SHOW SLAVE STATUS SHOW PROCESSLIST (3) 从服务器是否落后于主服务 Seconds_Behind_Master: 0 (4) 如何确定主从节点数据是否一致 percona -tools (5) 数据不一致如何修复 删除从数据库,重新复制

36、MySQL高可用 Master HA或多主模型 MMM: Multi Master MySQL,基于主从复制实现 MHA:Master HA,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一 从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一 主多从的架构,要搭建MHA,要求一个复制集群中必须最少有 三台数据库服务器,一主二 从,即一台充当master,一台充 当备用master,另外一台充当从库,出于机器成本的考虑, 淘宝进行了改造,目前淘宝TMHA已经支持一主一从 https://code.google.com/archive/p/mysql-master-ha/ Galera Cluster:wresp 通过wresp协议在全局实现复制;任何一节点都可读写,不需 要主从复制,实现多主可 读可写; 37、MHA

38、MHA

39、MHA工作原理 MHA工作原理 1 从宕机崩溃的master保存二进制日志事件(binlog events) 此机器必须Linux网络没问 题,只是服务出了问题; 2 识别含有最新更新的slave 3 应用差异的中继日志(relay log)到其他的slave 从主到从 4 应用从master保存的二进制日志事件(binlog events) 5 提升一个slave为新的master 6 使其他的slave连接新的master进行复制

40、MHA MHA软件由两部分组成,Manager工具包和Node工具包 Manager工具包主要包括以下几个工具: masterha_check_ssh 检查MHA的SSH配置状况 masterha_check_repl 检查MySQL复制状况 masterha_manger 启动MHA masterha_check_status 检测当前MHA运行状态 masterha_master_monitor 检测master是否宕机 masterha_master_switch 制故障转移(自动或手动) masterha_conf_host 添加或删除配置的server信息 41、MHA Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几 个工具: save_binary_logs 保存和复制master的二进制日志 apply_diff_relay_logs 识别差异的中继日志事件并将其 差异的事件应用于其他的slave filter_mysqlbinlog 去除不必要的ROLLBACK事件( MHA已不再使用这个工具) purge_relay_logs 清除中继日志(不会阻塞SQL线程) 注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失, 因此在配置MHA的同时建议 配置成MySQL 5.5的半同步复制; 实验:MHA 主服务器出现问题时会自动将从服务器替换为主服务器,监控主从复制的工具 (1)mha机器 yum install mha4mysql-manager-0.56-0.el6.noarch.rpm
yum install mha4mysql-node-0.56-0.el6.noarch.rpm 安装这两个监控程序需要epel源 mkdir /etc/mastermha/ vim /etc/mastermha/app1.cnf [server default] user=mhauser password=123789 manager_workdir=/data/mastermha/app1/ 会在起动监控后自动创建目录 manager_log=/data/mastermha/app1/manager.log remote_workdir=/data/mastermha/app1/ ssh_user=root repl_user=repluser repl_password=123789 ping_interval=1

[server1] hostname=172.18.62.61 candidate_master=1 [server2] hostname=172.18.62.62 candidate_master=1 [server3] hostname=172.18.62.63 实现ssh key: ssh-keygen ssh-copy-id 172.18.62.60 scp -rp /root/.ssh 172.18.62.61:/root/ scp -rp /root/.ssh 172.18.62.62:/root/ scp -rp /root/.ssh 172.18.62.63:/root/ masterha_check_ssh --conf=/etc/mastermha/app1.conf 测试ssh连接是否可以 masterha_check_repl --conf=/etc/mastermha/app1.conf 测试主从复制 masterha_manager --conf=/etc/mastermha/app1.conf 进行监控程序的启动 (2)master机器 [mysqld] log-bin server_id=1 innodb_file_per_table skip_name_resolve=1 mysql>show master logs mysql>grant replication slave on . to repluser@'172.18.62.%' identified by '123789'; mysql>grant all on . to mhauser@'172.18.62.%' identified by '123789'; yum install mha4mysql-node-0.56-0.el6.noarch.rpm (3)slave1机器 [mysqld] server_id=2 log-bin read_only relay_log_purge=0 skip_name_resolve=1 innodb_file_per_table

mysql>CHANGE MASTER TO MASTER_HOST='172.18.62.61', MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; yum install mha4mysql-node-0.56-0.el6.noarch.rpm (4)slave2机器 [mysqld] server_id=3 log-bin read_only relay_log_purge=0 skip_name_resolve=1 innodb_file_per_table

mysql>CHANGE MASTER TO MASTER_HOST='172.18.62.61', MASTER_USER='repluser', MASTER_PASSWORD='centos', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;

start slave; show slave status\G; yum install mha4mysql-node-0.56-0.el6.noarch.rpm

(5)排错 rm -f /data/mastermha/app1//app1.failover.complete 服务出问题时解决办法 cat /data/mastermha/app1/manager.log 查看日志观察是否恢复 另一种就是机器崩溃,电源断电,会正常恢复 注意:必须关闭安全机制和防火墙,否则会影响主从复制,还会使得监控程序的检查失败 42、MMA 自定义扩展: secondary_check_script:通过多条网络路由检测master的 可用性 master_ip_ailover_script:更新Application使用的 masterip shutdown_script:强制关闭master节点 report_script:发送报告 init_conf_load_script:加载初始配置参数 master_ip_online_change_script:更新master节点ip地址 配置文件: global配置,为各application提供默认配置 application配置:为每个主从复制集群 43、Galera Cluster Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案 右图图示:三个节点组成了一个集群,与 普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后, 集群自己会将新数据同步到其它节点上面 ,这种架构不共享任何数据,是一种高冗余架构

44、Galera Cluster特点 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失。 并发复制:从节点APPLY数据时,支持并行执行,更好的性能 故障切换:在出现数据库故障时,因支持多点写入,切换容易 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。 在节点故障期间,节点本身对集群的影响非常小 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提 供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致 对应用透明:集群的维护,对应用程序是透明的

45、Galera Cluster工作过程

注意:客户端修改某一主服务器上的数据,然后主服务器返回成功,主服务器将数据同步到其他 的主服务器,并且伴随有数据是否一致的检查功能; 46、Galera Cluster Galera Cluster官方文档: http://galeracluster.com/documentation-webpages/galera-documentation.pdf http://galeracluster.com/documentation-webpages/index.html https://mariadb.com/kb/en/mariadb/getting-started-withmariadb-galera-cluster/ Galera Cluster包括两个组件 Galera replication library (galera-3) WSREP:MySQL扩展Write Set Replication API wresp复制实现: percona-cluster MariaDB-Cluster 至少需要三个节点,不能安装mariadb-server

47、MySQL复制 yum install MariaDB-Galera-server vim /etc/my.cnf.d/server.cnf wsrep_provider = /usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://172.16.0.7,172.16.0.17,172.16.0.27" binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 下面配置可选项 wsrep_cluster_name = ‘mycluster‘默认my_wsrep_cluster wsrep_node_name = 'node1' wsrep_node_address = ‘172.16.0.7' 实验:galera cluster 服务器集群 (1)A机器 配置安装数据库的yum源: vim /etc/yum.repos.d/base.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/5.5/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 enabled=0 记得开启epel源 yum install MariaDB-Galera-server 安装具有集群功能的数据库 rpm -ql galera vim /etc/my.cnf.d/server.cnf 编辑配置文件 [galera] wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://172.18.62.60,172.18.62.61,172.18.62.62" binlog_format=row /etc/init.d/mysql start --wsrep-new-cluster 开启数据库服务并开启集群环境 (2)B机器 yum install MariaDB-Galera-server 安装具有集群功能的数据库 rpm -ql galera vim /etc/my.cnf.d/server.cnf 编辑配置文件 [galera] wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://172.18.62.60,172.18.62.61,172.18.62.62" binlog_format=row /etc/init.d/mysql start 或 systemctl start mysql 开启数据库服务加入集群环境 (3)C机器 yum install MariaDB-Galera-server 安装具有集群功能的数据库 rpm -ql galera vim /etc/my.cnf.d/server.cnf 编辑配置文件 [galera] wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://172.18.62.60,172.18.62.61,172.18.62.62" binlog_format=row /etc/init.d/mysql start 或 systemctl start mysql 开启数据库服务加入集群环境 (4)之后进入数据库进行测试即可 注意:要确保每个机器的干净再装好数据库 48、MySQL复制 首次启动时,需要初始化集群,在其中一个节点上执行命令: /etc/init.d/mysql start --wsrep-new-cluster 而后正常启动其它节点 service mysql start 查看集群中相关系统变量和状态变量: SHOW VARIABLES LIKE 'wsrep_%‘; SHOW STATUS LIKE 'wsrep_%‘; SHOW STATUS LIKE 'wsrep_cluster_size‘; SHOW STATUS LIKE 'wsrep_cluster%‘; 注意:虚拟ip是多个服务器使用同一个虚拟的ip,虚拟ip指向其中一个机器,当这个机器坏了后就 指向另一个机器;损坏就发生漂移 49、复制 读写分离: mysql-proxy --> Atlas (Qihoo) 奇虎360 Amoeba:https://sourceforge.net/projects/amoeba/ dbproxy:https://github.com/Meituan-Dianping/DBProxy 注意:此软件是在应用程序和mysql数据库之间的代理软件,用于实现某些功能如读写分离; 50、复制的问题和解决方案 复制的问题和解决方案: (1) 数据损坏或丢失 Master:MHA + semi repl Slave: 重新复制 全备份恢复,加入重新变成从服务器 (2) 混合使用存储引擎 MyISAM:不支持事务 InnoDB:支持事务 (3) 不惟一的server id 重新复制 (4) 复制延迟 需要额外的监控工具的辅助 一从多主 多线程复制:对多个数据库复制

51、性能衡量指标 数据库服务衡量指标: qps: query per second tps: transaction per second 压力测试工具: mysqlslap 系统自带 Sysbench:功能强大 https://github.com/akopytov/sysbench tpcc-mysql MySQL Benchmark Suite MySQL super-smack MyBench

52、MYSQL压力测试 Mysqlslap:来自于mariadb包,测试的过程默认生成一个 mysqlslap的schema,生成测试表t1,查 询和插入测试数据, mysqlslap库自动生成,如果已经存在则先删除。用--onlyprint来打印实际的 测试过程,整个测试完成后不会在数据库中留下痕迹 使用格式:mysqlslap [options] 常用参数 [options] 说明: --auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本 来测试并发压力 --auto-generate-sql-load-type=type 测试语句的类型 。代表要测试的环境是读操作还是写操 作还是两者混合的 。取值包括:read,key,write,update和mixed(默认);

53、MYSQL压力测试 --auto-generate-sql-add-auto-increment 代表对生成的 表自动添加auto_increment列,从5.1.18 版本开始支持; --number-char-cols=N, -x N 自动生成的测试表中包含多 少个字符类型的列,默认1 --number-int-cols=N, -y N 自动生成的测试表中包含多少 个数字类型的列,默认1 --number-of-queries=N 总的测试查询次数(并发客户数× 每客户查询次数) --query=name,-q 使用自定义脚本执行测试,例如可以调用 自定义的存储过程或者sql语句来执行 测试; --create-schema 代表自定义的测试库名称,测试的 schema,MySQL中schema也就是database --commint=N 多少条DML后提交一次 54、MYSQL压力测试 --compress, -C 如服务器和客户端都支持压缩,则压缩信息 --concurrency=N, -c N 表示并发量,即模拟多少个客户端 同时执行select。可指定多个值,以逗 号或者--delimiter参数 指定值做为分隔符。如:--concurrency=100,200,500 --engine=engine_name, -e engine_name 代表要测试的引 擎,可以有多个,用分隔符隔开。例 如:-- engines=myisam,innodb --iterations=N, -i N 测试执行的迭代次数,代表要在不同 并发环境下,各自运行测试多少次。 --only-print 只打印测试语句而不实际执行。 --detach=N 执行N条语句后断开重连 --debug-info, -T 打印内存和CPU的相关信息

55、mysqlslap示例 单线程测试 mysqlslap -a -uroot -pmagedu 多线程测试。使用–concurrency来模拟并发连接 mysqlslap -a -c 100 -uroot -pmagedu 迭代测试。用于需要多次执行测试得到平均值 mysqlslap -a -i 10 -uroot -pmagedu mysqlslap ---auto-generate-sql-add-autoincrement -a mysqlslap -a --auto-generate-sql-load-type=read mysqlslap -a --auto-generate-secondary-indexes=3 mysqlslap -a --auto-generate-sql-write-number=1000 mysqlslap --create-schema world -q "select count(*) from City” mysqlslap -a -e innodb -uroot -pmagedu mysqlslap -a --number-of-queries=10 -uroot -pmagedu 56、mysqlslap示例 测试同时不同的存储引擎的性能进行对比: mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 -- engine=myisam,innodb - -debug-info -uroot -pmagedu mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 -- engine=myisam,innodb --debug-info 本机测试,实验机器没密码 执行一次测试,分别50和100个并发,执行1000次总查询: mysqlslap -a --concurrency=50,100 --number-ofqueries 1000 --debug-info -uroot -pmagedu 50和100个并发分别得到一次测试结果(Benchmark),并发数 越多,执行完所有查询的时间越 长。为了准确起见,可以多迭 代测试几次: mysqlslap -a --concurrency=50,100 --number-ofqueries 1000 --iterations=5 --debug-info -uroot - pmagedu