【1.2】mysql迁移实践及注意事项
【1】需求
数据迁移,2个库迁移到新的实例上去;
思路:
按道理直接 mysqldump 导入导出就好了啊;
但实际上还有许多要考虑的事情;
【2】迁移步骤
【2.1】导出
(1)字符集与引擎问题
select table_schema,table_name,TABLE_COLLATION,ENGINE from information_schema.tables where table_schema='webshop' ;
(2)mysqldump 参数问题
mysqldump -uroot -p --set-gtid-purged=OFF --single-transaction --flush-privileges \
--master-data=2 --flush-logs --triggers --routines --events --hex-blob --lock-tables \
--max_allowed_packet=67108864 --B webshop > webshop_`date +%Y%m%d`.sql
1)GTID问题:--set-gtid-purged=OFF 2)binlog问题:--master-data=2
3)MYISAM引擎问题:--lock-tables 4)字符集问题:--default-character-set=utf8 ,这个要根据 (1) 中的情况对应导入导出
5)是否有drop database ifexists:-B 这个要注意看导出的文件,一般没有,但也怕有些版本会出现这个,把现有数据库删掉那就尴尬了;
【2.2】还原、导入
mysql --default-character-set=latin1 quanqingsanguo < test_latin_20210713.sql
mysql --default-character-set=utf8 quanqingsanguo < test_utf8_20210713.sql
还原也要注意字符集,根据导出的sql 文件字符集,导入时也要指定字符集,这样才能最大限度的保障数据一致性和字符集一致性
【3】迁移后核验
(3.1)迁移后表行数对比
注意修改条件 table_name in ...
echo 'create database test if not exists;'>>checktable.sql echo 'drop table if exists test.table_info;'>>checktable.sql echo 'create table test.table_info(table_schmea varchar(100),table_name varchar(100),rows int);'>>checktable.sql mysql -e "select concat('insert into test.table_info select ''',table_schema,''',''',table_name,''',count(*) as rows from ',table_schema,'.',table_name,';') from information_schema.tables \ where table_name in ('player','player_bag','player_attribute','player_hero','player_login_info','pay_order') ; " -N >> checktable.sql mysql < checktable.sql
(3.2)一致性对比
使用 pt-checksum
详细文档:https://www.cnblogs.com/gered/p/12882447.html