linux差异备份mysql出错_MySQL备份可能遇到的坑

本文详细探讨了在Linux环境下使用mysqldump、mysqlpump、mydumper和XtraBackup进行MySQL差异备份时可能遇到的问题。在不同工具下,由于DML操作、并发写入和一致性控制的不同处理,可能导致备份数据与实际数据不一致,进而影响到后续的数据库恢复和复制结构的建立。文章通过实例展示了问题的产生原因,并提出了相应的解决建议。
摘要由CSDN通过智能技术生成

MySQL备份工具,支持各种参数选项,使用不同的选项极有可能影响备份处理过程。本文使用我们常规认为合理的备份参数,测试/验证是否存在容易忽视的坑

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 常规备份参数

# 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操作对备份的影响

创建两张测试表

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 创建两张测试表(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

运行下面的脚本持续往测试表中写入数据

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#!/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执行过程

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 开启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

使用备份文件搭建复制

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 还原实例清空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的数据

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 查询从库出错表大于等于冲突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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

[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;

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值