数据库运维——MySQL主从复制

1.理解MySQL主从复制原理。

2.完成MySQL主从复制。


一、MySQL主从复制原理

MySQL主从复制是指将一个MySQL数据库服务器(称为主服务器)上的数据复制到其他MySQL数据库服务器(称为从服务器)的过程。它的原理如下:

  1. 主服务器将修改操作记录在二进制日志(二进制日志)中。
  2. 从服务器连接到主服务器,并请求复制日志的内容。
  3. 主服务器将二进制日志的内容发送给从服务器。
  4. 从服务器将接收到的二进制日志应用到自己的数据库中,以保持与主服务器的数据一致性。

数据库运维——MySQL主从复制_第1张图片

数据库运维——MySQL主从复制_第2张图片

(1)主从复制可以实现以下几个目标

  • 数据备份:从服务器可以作为主服务器的备份,以防止数据丢失。
  • 负载均衡:可以将读操作分散到多个从服务器上,减轻主服务器的压力。
  • 高可用性:如果主服务器出现故障,可以快速切换到从服务器提供服务。

(2)MySQL支持的复制类型

1.基于语句( statement )的复制

        在主服务器上执行SQL 语句,在从服务器上执行同样的语句。 MySQL 默认采用基于语句的复制,效率比 较高。

2.基于行( row )的复制

        把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0 开始支持。

3.混合型( mixed )的复制

        默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。

(3)为什么要做主从复制

        灾备

        数据分布

        负载平衡

        读写分离

        提高并发能力

(4)如何实现主从复制

        在主服务器(master )上

                (1)、启用二进制日志

                (2)、选择一个唯一的server-id

                (3)、创建具有复制权限的用户

        在从服务器(slave )上

                (1)、启用中继日志 (二进制日志可开启,也可不开启)

                (2)、选择一个唯一的server-id

                (3)、连接至主服务器,并开始复制

 二、完成MySQL主从复制

完成MySQL主从复制,需要执行以下步骤:

  1. 配置主服务器:

    • 在主服务器的配置文件(通常是my.cnf或my.ini)中启用二进制日志功能。
    • 配置一个唯一的server-id。
    • 重启主服务器以使配置生效。
  2. 创建复制用户:

    • 在主服务器上创建一个用于复制的用户,并为其授予REPLICATION SLAVE权限。
  3. 备份主服务器数据:

    • 在主服务器上执行适当的备份操作,以确保从服务器可以使用这个备份进行初始化。
  4. 配置从服务器:

    • 在从服务器的配置文件中启用复制功能。
    • 配置一个唯一的server-id。
    • 重启从服务器以使配置生效。
  5. 初始化从服务器:

    • 将主服务器上的备份数据导入到从服务器中。
  6. 启动复制过程:

    • 在从服务器上执行CHANGE MASTER TO命令,指定主服务器的IP地址、复制用户的凭据以及二进制日志文件和位置。
    • 启动从服务器的复制进程。

完成上述步骤后,MySQL主从复制将开始运行。你可以通过在主服务器上进行修改操作,然后在从服务器上查看是否同步来验证复制是否成功。

 (1)主机环境

主节点: 192.168.186.251 master

从节点 :192.168.186.100 slave1

(2)环境准备

关闭防火墙

[root@master ~]# systemctl disable firewalld
关闭selinux

[root@master ~]# setenforce 0

时间同步

主、从服务器使用相同版本的mysql数据库

(3)主节点配置

1.启用二进制日志 ,并为当前节点设置一个全局唯一的ID号,然后创建目录修改权限

[root@master ~]# vim /etc/my.cnf
[mysqld]
log_bin = /data/logbin/mysql-bin
server_id = 1
[root@master ~]# mkdir /data
[root@master ~]# mkdir /data/logbin
[root@master ~]# chown mysql.mysql /data/logbin/

 2.重新启动mysql服务

[root@master ~]# systemctl restart mysqld

3.查看/data/logbin/目录是否有数据

[root@master ~]# ls /data/logbin
mysql-bin.000001  mysql-bin.index

4.登录mysql,创建账号,账号授权

[root@master ~]# mysql -uroot -p123456
 
mysql5.7 [(none)]>create user wp@'192.168.186.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
 
mysql5.7 [(none)]>grant replication slave on *.* to wp@'192.168.186.%';
Query OK, 0 rows affected (0.01 sec)
 
mysql5.7 [(none)]>show grants for 'rep'@'192.168.186.%';
+---------------------------------------------------------+
| Grants for [email protected].%                            |
+---------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.186.%' |
+---------------------------------------------------------+
1 row in set (0.00 sec)

5.锁表设置只读,查看主库状态

mysql5.7 [(none)]>flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
 
mysql5.7 [(none)]>show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| have_statement_timeout      | YES      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 60       |
| wait_timeout                | 28800    |
+-----------------------------+----------+
13 rows in set (0.00 sec)
 
mysql5.7 [(none)]>show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 |      607 |              |                  | 388ebd53-291b-11ee-b68c-000c29090543:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
 
mysql5.7 [(none)]>\q
Bye

6.备份数据库数据

[root@master backup]# mysqldump -uwp -p -A -B | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
Enter password: 
[root@master backup]# ll
total 4
-rw-r--r--. 1 root root 20 Jul 25 11:17 mysql_bak.2023-07-25.sql.gz

(4)从节点设置

设置全局唯一的ID号

[root@slave1 ~]# vim /etc/my.cnf
 
[mysqld]
server_id=2

(5)在主节点将备份的数据复制到从节点上,并在从节点查看

master:
 
[root@master ~]# scp /server/backup/mysql_bak.2023-07-25.sql.gz 192.168.186.100:/server/backup
The authenticity of host '192.168.186.100 (192.168.186.100)' can't be established.
ECDSA key fingerprint is SHA256:ZGkVpFFM8KD+H3SRgZmWUpD+IlNK9Dwqcd+TAiGoyzM.
ECDSA key fingerprint is MD5:c2:93:1c:0a:8e:e1:4e:86:cc:90:78:5d:81:42:76:aa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.186.100' (ECDSA) to the list of known hosts.
[email protected]'s password: 
mysql_bak.2023-07-25.sql.gz                               100%   20    21.8KB/s   00:00    
 
slave1:
[root@slave1 ~]# ll /server/backup/
总用量 4
-rw-r--r-- 1 root root 20 7月  25 23:35 mysql_bak.2023-07-25.sql.gz
[root@slave1 ~]# cd /server/backup/
[root@slave1 backup]# gzip -d mysql_bak.2023-07-25.sql.gz 
[root@slave1 backup]# ll
总用量 0
-rw-r--r-- 1 root root 0 7月  25 23:35 mysql_bak.2023-07-25.sql

(6)设定主从库同步

mysql> change master to
MASTER_HOST='192.168.186.251',
MASTER_PORT=3306,
MASTER_USER='wp',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000025',
MASTER_LOG_POS=194;

(7)启动主从库同步开关

mysql> start slave;
检查状态:
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.186.251
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000025
          Read_Master_Log_Pos: 194
               Relay_Log_File: slave1-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000025
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

你可能感兴趣的:(运维,linux,mysql)