mysqldump数据库的迁移与校验

222 阅读1分钟

备份数据库

1. 确认服务已停或数据库只读

确认bin log 文件大小不变

show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000172 |  12067617 |
| mysql-bin.000173 |   3246328 |

设置数据库只读--方法1

show global variables like '%read_only%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | OFF   |
| super_read_only       | OFF   |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+

set global read_only = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | ON    |
+---------------+-------+

# 关闭 read_only 参数
mysql> set global read_only = 0;
Query OK, 0 rows affected (0.00 sec)

设置数据库只读--方法2

# 执行FTWRL
flush tables with read lock;
Query OK, 0 rows affected (0.02 sec)

# 解锁
unlock tables;

需要注意的是:从库端执行 flush tables with read lock 会导致 SQL 线程卡住,主备延迟。与开启read_only 参数不同的是,执行 flush tables with read lock 后,其余客户端执行数据变更操作会持续等待而不是立即报错,极其容易引起数据库hang住。

一般只有从库需要设置只读状态,从库端建议开启 read_only 或 super_read_only。 flush tables with read lock 适用于进行数据迁移时,可以保证数据库不发生数据改变,迁移后要注意及时解锁。

2.备份数据库

mysqldump -u<user> -p -h <host> -P <port> --opt -q --default-character-set=binary <database name> > database.sql

导入数据库

mysql -u<user> -p -h <host> -P <port>  -q --default-character-set=binary  <database name> < database.sql

检查数据是否一致

  • 下载
https://code.google.com/archive/p/maatkit/downloads
  • 安装mk-table-checksum
#安装依赖包
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI perl-Thread-Queue perl-Digest-MD5 perl-TermReadKey -y
rpm -ivh maatkit-7540-1.noarch.rpm
  • 检查
mk-table-checksum --count --databases <database> h=<host>,u=<user>,P=<port>,p='<password>' h=<host>,u=<user>,P=<port>,p='<password>' > check.txt