01-MySQL8主从详解( 二 )

温馨提示:在主服务器上最重要的二进制日志设置是sync_binlog,这使得mysql在每次提交事务的时候把二进制日志的内容同步到磁盘上 , 即使服务器崩溃也会把事件写入日志中 。
sync_binlog这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性 。对于"sync_binlog"参数的各种设置的说明如下:
sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘 。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘 。
在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的 。因为一旦系统Crash , 在binlog_cache中的所有binlog信息都会被丢失 。而当设置为“1”的时候,是最安全但是性能损耗最大的设置 。因为当设置为1的时候,即使系统Crash , 也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响 。
从以往经验和相关测试来看,对于高并发事务的系统来说 , “sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多 。
2.4 数据一致性在同步前保证master和slave中的数据一致,新环境忽略本步骤
导出数据库之前先锁定数据库
#数据库只读锁定命令,防止导出数据库的时候有数据写入,unlock tables命令解除锁定mysql> flush tables with read lock;导出master数据库中需要同步的库
#导出需要同步的库[root@master ~]#mysqldump -uroot test -p123456 >/opt/test.sql#如不指定 , 则导出所有库mysqldump -uroot -p123456 --all-databases>/opt/all.sql将导出数据导入salve中
#传到slavescp /opt/all slave:/opt#在slave导入数据库mysql> source /opt/all.sql2.5 创建数据同步账号登录主数据库创建一个用于从数据库复制的账号
mysql> create user 'rep'@'192.168.150.25' identified with mysql_native_password by 'repl123';grant replication slave on *.* to 'rep'@'192.168.150.25';mysql> flush privileges;查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)
mysql> show master status;+-----------+-----------+--------------+------------------+-------------------+| File| Position| Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-----------+-----------+--------------+------------------+-------------------+| mysql-bin.000065 | 186607472 ||||+-----------+-----------+--------------+------------------+-------------------+1 row in set (0.00 sec)2.6 配置slave修改my.cnf配置文件
vim /etc/my.cnf#设置从服务器id,必须于主服务器不同server-id=2#启动MySQ二进制日志系统log-bin=mysql-bin#需要同步的数据库名 。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)配置主从同步指令
#执行同步前,要先关闭slavemysql> stop slave;mysql> change master to master_host='192.168.150.185',master_user='repl',master_password='repl123',master_log_file='ON.000065',master_log_pos=186607472;mysql> start slave;mysql> show slave status \G;mysql> show slave status \G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.150.185Master_User: slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: ON.000065Read_Master_Log_Pos: 187730832Relay_Log_File: xmkjoa02-relay-bin.000002Relay_Log_Pos: 46151494Relay_Master_Log_File: ON.000065Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 187730832Relay_Log_Space: 46151706Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: YesMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: 6c3f5abb-1c32-11ec-96ba-fa163e7a46bfMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:Master_public_key_path:Get_master_public_key: 1Network_Namespace:1 row in set (0.00 sec)

推荐阅读