MySQL 8.0文档阅读: 基于File Position的主从复制replication

binlog配置

binlog参数

https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html
以下以--开头的参数, 表示只能通过启动参数或配置文件来设置

参数名 定义
–log-bin 设置binlog的路径和前缀
–log-bin-index 设置binlog 索引文件的路径和前缀, 默认情况下, 它的存放路径与–log-bin相同
–binlog-do-db=db_name 需要binlog的库, 如果需要指定多个库, 则配置多次
–binlog-ignore-db=db_name 需要忽略掉的库, 如果需要指定多个库, 则配置多次
binlog_expire_logs_seconds binlog有效时间, 默认为一个月,
sync_binlog 决定了什么时候将binlog同步到磁盘上, 对性能和可能靠性有重要影响. 如果要保证可靠性, 必须设置为1

修改binlog存放路径

mkdir /home/bin
chown mysql:mysql bin

vim /etc/my.cnf
log_bin=/home/bin/binlog

清除binlog

https://dev.mysql.com/doc/refman/8.0/en/reset-master.html

mysql> RESET MASTER ;
mysql> SHOW BINARY LOGS;

如果不加参数, 则会清除所有的binlog记录, 非常危险.
比较安全的做法是使用PURGE BINARY LOGS
https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html

导出binlog内容

https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html

shell> mysqlbinlog binlog.000001

执行执行binlog

配置master

https://dev.mysql.com/doc/refman/8.0/en/replication-howto-masterbaseconfig.html
MySQL8.0的binlog是默认开启的, 而5.7版本默认是关闭的, 额外修改配置文件

vim /etc/my.cnf
[mysqld]
server_id=1

service mysqld restart

创建master账号

https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html
需要修改密码强度, 才能使用简单密码

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

创建master快照

slave创建之后, 需要一次全量同步, 需要master创建一个全量的快照. 有两种方式

mysqldump热备

shell> mysqldump --databases test --master-data > dbdump.db -uroot -p123456

--master-data的作用有:
a. 开启--lock-all-tables, 也就是说dump时, 无法更新数据库. 如果库很大, 此方式跟冷备没多大差别了
b. 在dump文件中添加了一句CHANGE MASTER TO,

CHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=443;

导入备份文件

扫描二维码关注公众号,回复: 5572265 查看本文章
mysql test < dbdump.db -uroot -p123456

商业版物理热备

mysql的商业工具mysqlbackup提供物理热备, 也就是在备份过程中, 仍然可以对mysql读写.
商业版价格 https://shop.oracle.com/apex/product?p1=MySQL

物理冷备

如果没有商业工具, 那只能冷备了, 也就是停止运行mysql之后再备份
master和slave应当版本一致, 以避免出现不兼容的问题

为了安全, shutdown会执行额外的清理操作
mysql> set persist innodb_fast_shutdown=0;

先锁住表
mysql> FLUSH TABLES WITH READ LOCK;


找出当前的binlog位置
mysql> SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000003 |   309123 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

停止运行
mysqladmin shutdown -uroot -p123456

set persist innodb_fast_shutdown=0

然后拷贝mysql配置的data目录, 以下文件不需要拷贝
a. mysql目录
b. master.info, 这个文件已经过时了, 8.0没有
c. binlog文件, 通常情况下, binlog应该和datadir不在同一个磁盘下, 以避免同时损坏
d. relay log文件. 它是slave的binlog文件

通过Slave备份

如果没有商业备份工具, 正式上线之后, 只能通过slave备份.

配置Slave

vim /etc/my.cnf
[mysqld]
server_id=2

service mysqld restart

https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slaveinit.html

mysql> CHANGE MASTER TO MASTER_HOST='10.29.193.192',MASTER_USER='repl',MASTER_PASSWORD='123456';

或者
mysql> CHANGE MASTER TO MASTER_HOST='10.29.193.192',\
MASTER_USER='repl',MASTER_PASSWORD='123456', \
MASTER_LOG_FILE="binlog.000001", MASTER_LOG_POS=4 ;

查看slave状态

mysql> show slave  status \G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

导入快照

导入mysqldump快照

mysql test < dbdump.db -uroot -p123456

mysql> START SLAVE;

导入冷备快照

冷备中的文件拷贝到slave相应位置, 然后执行

mysql> CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=309123;
mysql> start slave;

https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html

启动slave

mysql> start slave;

mysql> show slave status \G;

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

总结

  1. 5.7与8.0之间的同步似乎不兼容, 没有成功. 将5.7升级到8.0之后才成功

猜你喜欢

转载自blog.csdn.net/wzj_whut/article/details/88546258