MySQL主从复制—2.一主一从

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;
原文地址:https://www.cnblogs.com/FGdeHB/p/15810811.html