文章目录
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;
导入备份文件
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
总结
- 5.7与8.0之间的同步似乎不兼容, 没有成功. 将5.7升级到8.0之后才成功