MySQL备份工具,支持各种参数选项,使用不同的选项极有可能影响备份处理过程。本文使用我们常规认为合理的备份参数,测试/验证是否存在容易忽视的坑
# 常规备份参数
# mysqldump
shell> mysqldump --single-transaction --master-data=2 -B replcrash >dbname_dump_serverid_`date +%Y%m%d`.sql
# mysqlpump
shell> mysqlpump --single-transaction -B replcrash >dbname_pump_serverid_`date +%Y%m%d`.sql
# mydumper
shell> mydumper -B replcrash -o /data/backup/mydumper
# XtraBackup
# backup
shell> innobackupex [--defaults-file=MY.CNF] BACKUP-ROOT-DIR
# apply-log
shell> innobackupex --apply-log [--defaults-file=MY.CNF] BACKUP-DIR
# copy-back
shell> innobackupex --copy-back [--defaults-file=MY.CNF] BACKUP-DIR
常规备份参数
官方社区版MySQL 5.7.19 基于Row+Position搭建的一主一从异步复制结构:Master->{Slave}
ROLE
HOSTNAME
BASEDIR
DATADIR
IP
PORT
Master
ZST1
/usr/local/mysql
/data/mysql/mysql3306/data
192.168.85.132
3306
Slave
ZST1
/usr/local/mysql
/data/mysql/mysql3308/data
192.168.85.132
3308
每次使用备份文件还原数据库后,重新搭建这个复制结构
备份工具版本:mysqldump、mysqlpump是MySQL 5.7.19中自带的;mydumper version 0.9.3、innobackupex version 2.4.8
一、mysqldump
1.1、DML操作对备份的影响
创建两张测试表
# 创建两张测试表(192.168.85.132,3306)usereplcrash;create tablepy_user_innodb(
uidint not nullauto_increment,
namevarchar(32),
add_timedatetime default current_timestamp,
server_idvarchar(10),primary key(uid),key(name)
)engine=innodb;create tablepy_user_myisam(
uidint not nullauto_increment,
namevarchar(32),
add_timedatetime default current_timestamp,
server_idvarchar(10),primary key(uid),key(name)
)engine=myisam;
View Code
运行下面的脚本持续往测试表中写入数据
#!/user/bin/python
importstringimportrandomimportMySQLdbimporttime
conn= MySQLdb.connect(host='192.168.85.132',
port=3306,
user='mydba',
passwd='mysql5719',
db='replcrash')"""create table py_user(
uid int not null auto_increment,
name varchar(32),
add_time datetime default current_timestamp,
server_id varchar(10),
primary key(uid),
key(name)
);"""
whileTrue:
r_name= ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(random.randint(20,30)))printr_name
cursor=conn.cursor()
cursor.execute("insert into py_user_myisam(name,add_time,server_id) values('%s',now(),@@server_id);" %str(r_name))
cursor.execute("insert into py_user_innodb(name,add_time,server_id) values('%s',now(),@@server_id);" %str(r_name))
conn.commit()
time.sleep(0.001)
Python DML
开启general_log,用来查看mysqldump执行过程
# 开启general_log
mydba@192.168.85.132,3306 [replcrash]> set global general_log_file='/data/mysql/mysql3306/data/mysql-general.log';
mydba@192.168.85.132,3306 [replcrash]> set global general_log=1;
# 清空general_log
[root@ZST1 logs]#cat /dev/null > /data/mysql/mysql3306/data/mysql-general.log
# 备份replcrash数据库
[root@ZST1 backup]# mysqldump-h127.0.0.1 -P3306 -uroot -p --single-transaction --master-data=2 replcrash >/data/backup/replcrash_dump_1323306_`date +%Y%m%d`.sql
View Code
使用备份文件搭建复制
# 还原实例清空GTID信息
mydba@192.168.85.132,3308 [replcrash]>reset master;
# 还原数据
[root@ZST1 backup]# mysql-h127.0.0.1 -P3308 -uroot -p replcrash
# 搭建复制
mydba@192.168.85.132,3308 [replcrash]>change master to
master_host='192.168.85.132',
master_port=3306,
master_user='repl',
master_password='repl',
master_auto_position=1;
# 启动复制,查看复制状态
mydba@192.168.85.132,3308 [replcrash]>start slave;
mydba@192.168.85.132,3308 [replcrash]>show slave status\G*************************** 1. row ***************************Master_Log_File: mysql-bin.000183Read_Master_Log_Pos:1541377Relay_Log_File: relay-bin.000002Relay_Log_Pos:741Relay_Master_Log_File: mysql-bin.000183Slave_IO_Running: Yes
Slave_SQL_Running: No
Exec_Master_Log_Pos:1042768Last_SQL_Errno:1062Last_SQL_Error: Could not execute Write_rows event on table replcrash.py_user_myisam; Duplicate entry'332' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event''s master log mysql-bin.000183, end_log_pos 1043062Retrieved_Gtid_Set: 8ab82362-9c37-11e7-a858-000c29c1025c:251874-253268Executed_Gtid_Set: 8ab82362-9c37-11e7-a858-000c29c1025c:1-251874Auto_Position:1
View Code
从上面的结果中可以看到,主键冲突了,在从库查询一下这个表中大于等于冲突key的数据
# 查询从库出错表大于等于冲突key的数据
mydba@192.168.85.132,3308 [replcrash]> select * from replcrash.py_user_myisam where uid>=332;+-----+--------------------------------+---------------------+-----------+
| uid | name | add_time | server_id |
+-----+--------------------------------+---------------------+-----------+
| 332 | X1LME9HO5V7WXNOKBVZE | 2018-01-02 09:05:07 | 1323306 |
| 333 | 2PBFQ7KS4BPIJ27G88EYXWEDSX5 | 2018-01-02 09:05:07 | 1323306 |
| 334 | E85Y2SS9UD0FZG4YGCNTRSWA8L | 2018-01-02 09:05:07 | 1323306 |
| 335 | Y2TQOEVJ58NN7EREL4WRZ | 2018-01-02 09:05:07 | 1323306 |
| 336 | O0MEATAXYIAE2V2IZG96YVQ56WEUHF | 2018-01-02 09:05:07 | 1323306 |
| 337 | A6QKRWEXHRGUA3V2CH61VXUNBVA3H2 | 2018-01-02 09:05:07 | 1323306 |
| 338 | NYCSI1HS61BN6QAVVYTZSC | 2018-01-02 09:05:07 | 1323306 |
| 339 | 7CFC1JQPIQGNC97MDTT8ZIMIZL7D | 2018-01-02 09:05:07 | 1323306 |
| 340 | GA78AR4Z12WQTEAM41JB | 2018-01-02 09:05:07 | 1323306 |
+-----+--------------------------------+---------------------+-----------+
9 rows in set (0.08 sec)
View Code
我们查看mysqldump备份文件获取的binlog pos
[root@ZST1 backup]# morereplcrash_dump_1323306_20180102.sql--GTID state at the beginning of the backup
SET @@GLOBAL.GTID_PURGED='8ab82362-9c37-11e7-a858-000c29c1025c:1-251873';-- Position to start replication or point-in-timerecovery from-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000183', MASTER_LOG_POS=1042441;
[root@ZST1 backup]#
View Code
这里的pos信息是mysqldump通过SHOW MASTER STATUS获取。查看mysqldump得到的general-log;
[root@ZST1 data]# vim /data/mysql/mysql3306/data/mysql-general.log
...2018-01-02T01:05:07.693104Z 10 Query FLUSH /*!40101 LOCAL*/TABLES2018-01-02T01:05:07.694738Z 9 Query insert into py_user_myisam(name,add_time,server_id) values('7ATZSNFNIBW5DZNMNZYBMV',now(),@@server_id)2018-01-02T01:05:07.701616Z 9 Query insert into py_user_innodb(name,add_time,server_id) values('7ATZSNFNIBW5DZNMNZYBMV',now(),@@server_id)2018-01-02T01:05:07.702139Z 10Query FLUSH TABLES WITH READ LOCK2018-01-02T01:05:07.702344Z 9Query commit2018-01-02T01:05:07.702411Z 10Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ2018-01-02T01:05:07.702597Z 10 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT*/
2018-01-02T01:05:07.702721Z 10 Query SHOW VARIABLES LIKE 'gtid\_mode'
2018-01-02T01:05:07.713019Z 10Query SELECT @@GLOBAL.GTID_EXECUTED2018-01-02T01:05:07.713179Z 10Query SHOW MASTER STATUS2018-01-02T01:05:07.725821Z 10Query UNLOCK TABLES2018-01-02T01:05:07.732125Z 9 Query insert into py_user_myisam(name,add_time,server_id) values('X1LME9HO5V7WXNOKBVZE',now(),@@server_id)2018-01-02T01:05:07.733237Z 9 Query insert into py_user_innodb(name,add_time,s