通过二进制日志实现主(master)从(slave)备份

77 阅读3分钟

最新版的改成源(source)到备份(replica)的叫法了。

1,首先是每台mysql服务器必须有一个唯一server_id,是个数字。直接修改/etc/my.cnf配置文件,所有的主从服务器都要配置,唯一即可,注意修改了配置文件需要重启mysqld服务。 另外master服务器必须开始binlog日志,show variables like 'log_bin';默认就是开启的这个应该问题不大。 查看配置文件的位置 mysql --help | grep my.cnf 另外slave服务器可以同时配置 read-only=1 只读服务器,除了root其他用户不能写数据。

2,在master服务器上创建专用的备份用户账号: mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password'; mysql> GRANT REPLICATION SLAVE ON . TO 'repl'@'%.example.com';

3,查看master服务器的二进制日志坐标, mysql> FLUSH TABLES WITH READ LOCK; //刷新一下 mysql> SHOW BINARY LOG STATUS\G; *************************** 1. row *************************** File: mysql-bin.000003 Position: 73 Binlog_Do_DB: test Binlog_Ignore_DB: manual, mysql Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5 1 row in set (0.00 sec) 该 File 列显示日志文件的名称, Position 该列显示文件中的位置。 如果之前是在禁用二进制日志记录的情况下运行, SHOW BINARY LOG STATUS 则 显示的日志文件名和位置值为空。在这种情况下,稍后在指定二进制日志文件和位置时需要使用的值是空字符串 ( '' ) 和 4 。 这里事情其实还是有的,为简化记就不一一记录了,有需要可以参考mysql文档,虽然它的文档写的几乎算是最差的了。 在这之后如果master服务器已有数据 并且slave也想复制的话,需要手动备份数据并在slave上恢复。这里是两个干净的数据库 就直接跳过了。

4,在slave服务器上配置master信息: mysql> CHANGE REPLICATION SOURCE TO -> SOURCE_HOST='source_host_name', -> SOURCE_USER='replication_user_name', -> SOURCE_PASSWORD='replication_password', -> SOURCE_LOG_FILE='recorded_log_file_name', -> SOURCE_LOG_POS=recorded_log_position;

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.206.106',SOURCE_USER='repl',SOURCE_PASSWORD='1234',SOURCE_LOG_FILE='mysql-bin.000003',SOURCE_LOG_POS=73,SOURCE_PUBLIC_KEY_PATH='public_key.pem';

5,START REPLICA ;

6,到这里果然不出意外的话 还是出现意外了连接失败,查看mysql的错误日志: tail 300 /var/log/mysqld.log 可以看到: Error connecting to source 'repl@192.168.206.106:3306'. Message: Authentication plugin 'caching_sha2_password' reported error。 这个就是我上面说的事情还是有的事情之一,果然有些东西跳过还是不行。根据文档说是少了一个配置,SOURCE_PUBLIC_KEY_PATH,这个公钥默认跟二进制的在一个目录配置一下文件名就可以了。 CHANGE REPLICATION SOURCE TO -> SOURCE_HOST='source_host_name', -> SOURCE_USER='replication_user_name', -> SOURCE_PASSWORD='replication_password', -> SOURCE_LOG_FILE='recorded_log_file_name', -> SOURCE_LOG_POS=recorded_log_position, -> SOURCE_PUBLIC_KEY_PATH='public_key.pem';

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.206.106',SOURCE_USER='repl',SOURCE_PASSWORD='1234',SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=4696,SOURCE_PUBLIC_KEY_PATH='public_key.pem'; stop replica; 重新执行:CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.206.106',SOURCE_USER='repl',SOURCE_PASSWORD='1234',SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=4696,SOURCE_PUBLIC_KEY_PATH='public_key.pem'; 注意修改source_log_file 和 source_log_pos 的值。 再次运行 start replica; 使用 show status replica;来查看备份数据库的状态,从master到source,从slave到replica不知道要搞什么。这样子就能够搞定了。 应该这里修改mysql默认的身份验证插件也可以搞定。select * from mysql.user\G;将caching_sha2_password改成mysql_native_password,不加这个配置也可以。

这个的限制还是有点多的,不是很灵活,应该是少了一些配置,这个之后再研究,总之这样子一个简单的主从备份就完成了, 注意我这里是8.4的版本如果使用8.0 有些操作是不一样的,注意研究文档。