1、准备说明
- 两台服务器要时间同步,ntp+crontab
- Master和Slave的版本最好相同,至少保证Slave的版本要比Master的版本高
- 创建复制用用户repl并赋权
- 主从服务器Server-ID要不同
- 从服务器要启动中继日志,禁用二进制日志
2、创建、赋权用户
- 在主机创建并赋权复制用户
| mysql> grant replication slave,replication client on *.* to 'repl'@'从机ip' identified by '密码';
| # 单独赋权slave和client
| # 出于安全考虑,只给从机地址访问权限
- 出现ERROR 1819 (HY000): Your password does not satisfy ...
| mysql> set global validate_password_policy=LOW; // 降低密码复杂度
mysql> grant replication slave,replication client on *.* to 'repl'@'从机ip' identified by '密码';
mysql> flush privileges;
3、设置配置文件
3.1-配置概括
- 主机
| 1.设置server-id
| 2.启动binlog
- 从机
| 1.设置server-id
| 2.禁用binlog
| 3.启动relaylog
3.2-配置文件说明
log_slave_updates // 表示从节点自动更新
slave_skip_errors=all // 跳过所有错误日志
sync_binlog=1 // 每次事务提交,MySQL都会写入binlog
# 1最安全但是性能损耗最大;默认是0;一般有设置100的
log_slave_updates=1 // 从库自动更新
3.3-主库配置文件(/etc/my.cnf)
※ 傻瓜式安装,本地datadir的默认值 "datadir=/var/lib/mysql" ※
※ 遵循此目录手工添加二进制目录和中继目录,否则会报错 ※
#binlog
#binlog_format=statement
server-id=1 // id要不同
log-bin=/var/lib/mysql/mysql-bin // 开启二进制日志,并设置路径
binlog_format=mixed // 设置混合模式
binlog_cache_size=4M
expire_logs_days=10
sync_binlog=0
log-bin-index=binlog.index // 除了路径、id、模式,自玩其他都不重要
3.4-从库配置文件(/etc/my.cnf)
# binlog
# binlog_format=statement
server-id=2
# log-bin=/var/lib/mysql/mysql-bin // 关闭从机二进制文件
binlog_format=mixed
binlog_cache_size=4M
expire_logs_days=10
sync_binlog=0
log-bin-index=binlog.index
relay_log_purge=1
relay_log_recovery=1
relay-log=/var/lib/mysql/rely-bin // 开启从机中继日志
relay-log-index=relay-bin.index
3.5-查看相关状态
[root@localhost mysql]# systemctl restart mysqld // 主从都重启mysql
mysql> show global variables like '%log_bin%'; // 主端
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
mysql> show global variables like '%relay%'; // 从端
+---------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------+------------------------------------------+
| max_relay_log_size | 0 |
| relay_log | |
| relay_log_basename | /var/lib/mysql/localhost-relay-bin |
| relay_log_index | /var/lib/mysql/localhost-relay-bin.index |
| relay_log_info_file | relay-log.info |
| relay_log_info_repository | FILE |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| sync_relay_log | 10000 |
| sync_relay_log_info | 10000 |
+---------------------------+------------------------------------------+
# basename,index与配置文件中不一致是我中间做了操作;这里显示的是默认值,后已变更。
4、从端连接主端
4.1-查看主机二进制文件信息
mysql> show master status;
+------------------+----------+--------------+---------- -+------------+
| File | Position | Binlog_Do_DB | Binlog_... | Executed...|
+------------------+----------+--------------+------------+------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------+------------+
# 连接的时候用这两个数值File和Position
4.2-连接Master
- 从库指定复制用户,主服务器IP、端口以及开始执行复制的日志文件和位置等
| mysql> change master to master_host='主ip',master_user='复制用户',
| -> master_password='密码',master_port=3306,
| -> master_log_file='flie',master_log_pos=position;
# master_port和master_log_pos是不加引号的
# master_log_file和master_log_pos是上边查出来的值
4.3-change master to 选项说明
- master_bino='interfce_name'
- master_host='host_name' // 指定连接的Master服务器的地址
- master_user='user_name' // 指定连接的Master进行复制使用的账号
- master_password='password' // 密码
- master_port=port_num // 指定连接Master的哪个端口
- master_connect_retry=interval // 重试间隔时间
- master_retry_count=count // 重试次数
- master_delay=interval // 当Slave发现Master的心跳信息消失,隔多久中再次测试
- master_heartbeat_period=interval // Slave端每隔多长时间测试一次主端是否在线
- master_log_file='master_log_name' // 指定让Slave读取Master的哪个二进制日志文件
- master_log_pos=master_log_pos // 指定让Slave读取Master的哪个二进制日志文件的位置
- master_auto_position={0|1} // 1是自动找点同步
- relay_log_file='relay_log_name'
- relay_log_pos=relay_log_pos
- master_ssl={0|1}
- master_ssl_ca='ca_file_name'
- master_ssl_capath='ca_directory_name'
- master_ssl_cert='cert_file_name'
- master_ssl_crl
- master_ssl_crlpath
- master_ssl_key
- master_ssl_cipher
- master_ssl_verify_server_cert
- master_tls_version
- master_server_ids
5、从端开启主从复制
5.1-正常启动slave
mysql> show slave status\G
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.3.123
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: rely-bin.000002
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Connecting // 必须两个都是Yes,未开启是No
Slave_SQL_Running: Yes // connecting可能有多种原因造成
5.2-排查connecting错误后,重启
mysql> stop slave;
.....
.....
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.123
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 2033
Relay_Log_File: rely-bin.000007
Relay_Log_Pos: 2246
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
# 排查后是ip写错;操作需谨慎;修改完最好刷新权限 flush privileges;
# 配置新机,又connecting;firewall没设置,关闭;selinux不用理会
==================================================================
- Slave_IO_Running的Connecting
| 1.网络不通
| 2.账号密码错误
| 3.防火墙
| 4.mysql配置文件问题
| 5.连接服务器时语法问题
| 6.主服务器mysql权限问题
- Slvae_SQL_Running未碰到问题,不整理了
6、从库设置只读
mysql> set global read_only=1; // 开启只读模式
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock; // 从数据库设定全局锁
mysql> unlock tables; // 从数据库解除全局锁
# 1.只读模式只能限制普通用户,不能限制超级用户;也不能限制有较高权限普通用户。
# 2.想要完全只读,只能锁表;锁表从库无法将读取到的二进制日志加载到数据库中。
# 3.这种开启只读模式的方式只能是: read_only=1 + 用户权限设置
# 4.如果加了全局锁,二进制日志是否同步?是否可以通过手动方式重新加载呢?
7、从库清除主从复制
# 增加清理步骤是为了汇总整理到一起
mysql> stop slave;
mysql> reset slave;
mysql> show slave status\G
*************************** 1. row *************************** // 未清理干净
Slave_IO_State:
Master_Host: 192.168.3.121
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
=============================================================
mysql> reset slave all;
mysql> show slave status; // 清理干净了
Empty set (0.11 sec)
8、补充内容
¤ Ⅰ 连接主机设置说明 ¤
mysql> change master to master_host='ip',master_user='用户',master_password='密码';
# 1.没指定从哪个二进制文件开始复制,就是从0开始复制,会读取master的全部二进制日志文件。
# 2.如Master已经运行很久了,不能这样写。
# 3.我用5.7就这么写效果比较好。指定二进制文件的话,反而无法识别
==========================================================
¤ Ⅱ 启动复制相关线程 ¤
- 三种启动模式
- 1.默认启动
| mysql> start slave;
- 2.只启动某一个线程,比如启动io
| mysql> start slave thread_type io_thread;
- 3.复制到指定位置就停止复制
| mysql> start slave until master_log_file='binlog-index-000012',master_log_pos=120;