记一次mysql主库向从库的数据迁移

二更:

1、如果授予mysql权限后仍有问题,检查 /data/mysql/ 下的auto.cnf 文件,可能是 uuid 冲突,重新把从库的uuid改一个就好了。

2、另: 把/data/mysql目录赋权给mysql用户,命令 :  chown -R mysql:mysql /data/mysql

 

以下是原文

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

本文记录工作中遇到的mysql主库向从库的数据迁移问题

事件起因:因前期的运维工作操作不当,有对从库做数据变更和表结构的更新,造成主库与从库数据不一致。因业务中使用读写分离的架构,要求主从一致,所以需要将主库的数据迁移到从库中,以来修正之前的错误。

主库服务器ip:192.168.1.131
从库服务器ip:192.168.1.132

mysql用户  rouser  123456

首先停止业务,防止数据写入
1、停止了主库131和从库132的mysql服务,使用了命令

service mysqld stop

2、在132上,更改了/data/mysql 的文件夹名,用来备份原数据,使用了命令 

Cd /data
mv mysql mysql_bk

3、将131 主库的文件 拷贝到132 ,使用了命令

scp -r mysql [email protected]:/data

4、等待拷贝完毕(拷贝过程依据数据量和服务器磁盘读写能力有所不同)
5、进入132的 /data/mysql
6、删除日志文件,使用了命令(这里要删除ib_logfile0 和1 的文件,后面从库服务启动后,文件自动生成)

rm ib_logfile0
y
rm ib_logfile1
y
rm -rf mysql-bin.000*

7、启动主库131 的mysql,使用了命令

service mysqld start

8、启动从库132 的mysql,使用了命令

service mysqld start

发现启动失败

9、开始检查132的 存储空间,使用了命令

df -h

发现空间正常,没有超过50%

10、检查mysql服务,使用了命令

ps -ef|grep mysqld

11、发现一个mysqld的进程42714,不判定是否是该服务,使用了命令(这一步操作时非常担心,阅读者在操作时注意查看进程)

kill -9 42714

12、再次对132从库进行启动,使用了命令

service mysqld start

发现仍旧启动失败

13、查看从库mysql配置,my.cnf ,查找mysql 的错误日志
14、检查到报错

2019-11-19T17:29:17.934287Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-11-19T17:29:17.935769Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.20) starting as process 47270 ...
2019-11-19T17:29:17.939508Z 0 [Note] InnoDB: PUNCH HOLE support available
2019-11-19T17:29:17.939530Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-11-19T17:29:17.939536Z 0 [Note] InnoDB: Uses event mutexes
2019-11-19T17:29:17.939540Z 0 [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
2019-11-19T17:29:17.939544Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2019-11-19T17:29:17.939548Z 0 [Note] InnoDB: Using Linux native AIO
2019-11-19T17:29:17.940750Z 0 [Note] InnoDB: Number of pools: 1
2019-11-19T17:29:17.940882Z 0 [Note] InnoDB: Using CPU crc32 instructions
2019-11-19T17:29:17.942488Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2019-11-19T17:29:17.952678Z 0 [Note] InnoDB: Completed initialization of buffer pool
2019-11-19T17:29:17.955267Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-11-19T17:29:17.965389Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2019-11-19T17:29:17.965435Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2019-11-19T17:29:17.965443Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-11-19T17:29:18.566394Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-11-19T17:29:18.566437Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-11-19T17:29:18.566445Z 0 [ERROR] Failed to initialize plugins.
2019-11-19T17:29:18.566451Z 0 [ERROR] Aborting


15、赋予ibdata1 权限,使用了命令(773命令权限较高,建议阅读者降低权限,避免外网访问数据库时拿到权限)

chmod -R 773 ibdata1 

16、尝试再次启动从库mysql服务,使用了命令

service mysqld start
仍旧启动失败

17、发现了一个 mysql-bin.index 文件,百度说需要删除
18、备份该文件后,删除了该文件
19、尝试再次启动从库mysql服务,使用了命令

service mysqld start
仍旧启动失败

20、还原了mysql-bin.index 文件
21、再次查看报错日志

2019-11-19T17:57:53.297681Z 0 [ERROR] InnoDB: Cannot create ./ib_logfile101
2019-11-19T17:57:53.297688Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2019-11-19T17:57:53.898589Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2019-11-19T17:57:53.898633Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2019-11-19T17:57:53.898640Z 0 [ERROR] Failed to initialize plugins.
2019-11-19T17:57:53.898645Z 0 [ERROR] Aborting

2019-11-19T17:57:53.898658Z 0 [Note] Binlog end

22、赋予/data/mysql 权限,使用了命令

chmod -R 773 /data/mysql

16、尝试再次启动从库mysql服务,使用了命令

service mysqld start
服务启动成功!

17、登录主库服务器的mysql,使用了命令

mysql -urouser -h127.0.0.1 -P8635 -p123456

18、查看主库状态,使用了命令 

show master status;

19、登录从库服务器的mysql,使用了命令

mysql -urouser -h127.0.0.1 -P8635 -p123456

20、同步主库状态,使用了命令(在从库服务器上操作这个命令,同步主库的信息)

change master to master_host='192.168.1.131', master_user='repl_user', master_password='123456',master_port=8635,master_log_file='mysql-bin.000156', master_log_pos=154;


21、启动从库,查看从库状态,使用了命令

start slave;
show slave status \G;

两个Yes

22、验证,在主库新增一条数据,再从库查看


23、yes,验证ok,主从同步迁移和验证做完了。

总结:整个过程,加上scp和找错的时间,共耗时2h,迁移数据量有近200GB,因为是SSD磁盘,传输速度较快。在排查错误时,完全是自行百度,因为是新手,找错误日志能力还是有点低,会吸取这次教训,避免以后的犯错。另外,从库的数据以后再也不要再做除查询以外的操作了。

你可能感兴趣的:(mysql,mysql迁移,主从迁移,mysql主从不一致)