背景说明:一套旧环境上的小型云上的MySQL数据库,要迁移到实体机上。
旧环境的MySQL是5.7.33
新环境的MySQL是8.0.26
一、导出
1、创建备份目录
mkdir -p 备份文件存储路径
2、使用mysqldump导出
cd /mysql安装路径/bin
./mysqldump -u用户名 -p -P端口号--socket=sock完整路径 --master-data=2 --flush-logs --set-gtid-purged=off --triggers --routines --events --databases 数据库名 > /备份文件存储路径/数据库名.sql
注意事项:导出前,检查一下sql_mode有没有8.0不支持的,先去掉。比如我遇到的“NO_AUTO_CREATE_USER”,懒得重新导了,手动处理一下:
sed -i "s/NO_AUTO_CREATE_USER//g" /备份文件存储路径/数据库名.sql
二、导入
cd /mysql安装路径/bin
./mysql -u 用户名 -p --socket=sock完整路径 -P端口号 < /备份文件存储路径/数据库名.sql
三、增量数据处理
注意:当增量数据量极少时,可以采用此方法,当增量数据特别大时,该方法效率反而比整库备份更差。(如果新增的binlog超过一个文件,则不建议采用此方法)
1、查询上次备份后的位置点信息
head -n 100 /备份文件存储路径/数据库名.sql | grep "CHANGE MASTER TO "
2、在备份的源服务器上生成binlog对应的sql文件
cd /mysql安装路径/bin
./mysqlbinlog --start-position=步骤1中的MASTER_LOG_POS 步骤1中的MASTER_LOG_FILE --skip-gtids > /备份文件存储路径/binlog.sql
注意:--skip-gtids:意思是不把gtid信息写到binlog中,否则导入会报错:“ERROR 1782 @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON”
3、binlog对应的sql文件传输到新服务器上,并将其导入
cd /mysql安装路径/bin
./mysql -uroot -p < /备份文件存储路径/binlog.sql