MySQL主从复制(基于 5.6)

MySQL主从复制(基于 5.6)

https://dev.mysql.com/doc/refman/5.6/en/replication.html
https://dev.mysql.com/doc/refman/5.6/en/faqs-replication.html
https://dev.mysql.com/doc/refman/5.6/en/replication-howto.html

第一步:

主服务器 my.cnf 最小化配置

[mysqld]
log-bin=mysql-bin
server-id=1

以下为 mysql 推荐配置,但是会影响性能,一般DBA不设置此配置

innodb_flush_log_at_trx_commit=1
sync_binlog=1

以下为完整配置

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql    # 不同步mysql库
binlog_cache_size=1M    # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_format=mixed    # 主从复制模式,(mix,statement,row,默认statement)
expire_logs_days=7    # 二进制日志自动删除/过期的天数,默认0不删除
user=mysql
port=33306
datadir=/data/mysql/data

第二步:

副本服务 my.cnf

[mysqld]
server-id=2
log-bin=mysql-bin-slave1
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
user=mysql
port=33306
datadir=/data/mysql/data

第三步:

创建复制用户
主服务需要建立个同步账户,并具有 REPLICATION SLAVE 的权限,每个副本也需要同步账户,但是可以是不同的账户也可以是相同账户。
在主服务:

CREATE  USER  'repl'@'%'  IDENTIFIED  BY  '*Repl@faw2022*';
GRANT  REPLICATION  SLAVE  ON  *.*  TO  'repl'@'%';

第四步:

获取主服务二进制日志坐标
需要先执行 FLUSH TABLES WITH READ LOCK; 阻止对InnoDB表的提交操作
SHOW MASTER STATUS; 来确定二进制日志文件的位置,记录下 POSITION 的值
mysql> UNLOCK TABLES;(这个释放锁,可以是在同步完 slave 服务后,再释放,如果master没人在读写数据,此第四步可以不锁)

第五步:

通过 mysqldump 创建数据快照
mysqldump -uroot -psino@Soft2022 --all-databases --master-data > dbdump.db
--master-data选项:自动追加 在副本启动复制过程需要的 CHANGE MASTER TO 语句

第六步:

在从服务执行:
mysql -uroot -psino@Soft2022 < dbdump.db

第七步:

在从服务 slave 中设置 master 信息:

mysql> CHANGE MASTER TO master_host='10.123.240.71', master_user='repl', master_password='Repl@faw2022', master_port=33306, MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120, master_connect_retry=30;

第八步:

在从服务启动slave:
mysql> START SLAVE;

第九步(成功):

在从服务确认 slave 状态:
mysql> show slave status\G;
Slave_IO_RunningSlave_SQL_Running 这些都是 YES 状态,就表示从节点在工作了

在主从复制的节点中,再加从节点:

主节点宕机如何快速切换:

https://dev.mysql.com/doc/refman/5.6/en/replication-solutions-switch.html

从节点宕机如何做数据恢复: