备份数据库
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