linux系统mysql主从复制

发布时间:2023年12月22日

优点

MySQL主从复制的优点:

横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
备份 - 可以使用从服务器数据进行备份,减轻主服务器的压力。

原理

主服务器上面的任何修改都会保存在二进制日志( Bin-log日志)里面。从服务器上面启动一个I/O线程,(5.5以后多线程) 连接到主服务器上面请求读取二进制(Bin-log)日志,然后把读取到的二进制日志写到本地的Realy-log(中继日志)里面。 从服务器上面同时开启一个SQL线程,读取Realy-log(中继日志),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

准备环境

防火墙和selinux

systemctl stop firewalld --now && setenforce 0

修改主机名

hostnamectl set-hostname master

固定ip

cat /etc/sysconfig/network-scripts/ifcfg-ens33     //网卡配置文件

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=10.12.155.175       //ip地址
PREFIX=24                  //子网掩码
GATEWAY=10.12.155.254      //网关
DNS1=223.5.5.5             //dns服务器
DNS2=223.6.6.6             //dns服务器

主机名解析

vim /etc/hosts      //主机名解析文件
10.12.155.175 master
10.12.155.178 slave

清理环境

清理数据库

yum -y erase `rpm -qa | egrep "mysql|mariadb"`     //卸载mysql和mariadb

rm -rf /etc/my* && rm -rf /var/lib/mysql && rm -rf /usr/bin/mysql  //删除mysql文件

检查配置是否清理干净

[[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "环境已经清理完成" || echo "环境未清理"

安装数据库

yum安装

上传yum包,解压,进入目录

安装mysql

yum -y install *     //安装mysql

初始化mysql

systemctl start mysqld     //第一次启动mysql,也就是初始化mysql

关闭密码安全策略

vim /etc/my.cnf
validate_password=OFF   //yum安装mysql密码有安全策略,提前关闭安全策略

修改密码

mysqladmin -uroot -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password '0'     //查找初始密码并修改密码

无数据主从复制

主库服务器

开启binlog服务
mkdir -pv /data/      //创建存放binlog日志目录

chown mysql.mysql /data      //修改目录所有者和属组

vim /etc/my.cnf           //mysql配置文件
server-id=175             //设置serverid
log-bin=/data/mysql-bin   //设置logbin日志存放目录
重启数据库
systemctl restart mysqld     //修改mysql文件,需要重启服务
创建一个提供远程复制的用户
mysql> grant replication slave on *.* to 'relication'@'%' identified by '0';  //创建一个只有复制权限的用户

mysql> flush privileges;   //刷新数据表
查看binlog日志文件
mysql> show master status\G

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

从库服务器

配置server-id
vim /etc/my.cnf       //mysql配置文件
server-id=178         //配置server-id

systemctl restart mysqld   //重启mysql服务
从库配置
mysql> ? change master to         //查看change master服务

mysql> CHANGE MASTER TO           //配置从库连接主库信息
  MASTER_HOST='master',
  MASTER_USER='replication',
  MASTER_PASSWORD='0',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
启动slave
mysql>start slave;
查看主从配置信息
mysql> show slave status\G    
Slave_IO_Running: Yes    io线程启动
Slave_SQL_Running: Yes   sql线程启动

## uuid
Master_UUID: 6f6d0551-a073-11ee-9f28-000c298a6e96
mysql的uuid在数据目录下的auto.cnf文件,可以和主库的文件对比
uuidgen    //重新生成uuid
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: relication
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 527
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 203
                  Master_UUID: 6f6d0551-a073-11ee-9f28-000c298a6e96
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

从库重新配置

停止slave服务
mysql>stop slave;
重新配置slave
mysql>reset slave;
从库配置
mysql>CHANGE MASTER TO
 MASTER_HOST='master',
 MASTER_USER='relication',
 MASTER_PASSWORD='0',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000001',
 MASTER_LOG_POS=154,
 MASTER_CONNECT_RETRY=10;     //尝试重新连接的时间
启动slave
mysql>start slave;
查看主从配置信息
mysql> show slave status\G    

有数据主从复制

主库服务器

创建一个提供远程复制的用户
mysql> grant replication slave on *.* to 'relication'@'%' identified by '0';  //创建一个只有复制权限的用户

mysql> flush privileges;   //刷新数据表
开启binlog服务
mkdir -pv /data/      //创建存放binlog日志目录

chown mysql.mysql /data      //修改目录所有者和属组

vim /etc/my.cnf           //mysql配置文件
server-id=175             //设置serverid
log-bin=/data/mysql-bin   //设置logbin日志存放目录
重启数据库
systemctl restart mysqld     //修改mysql文件,需要重启服务
锁表备份
mysql>flush tables with read lock;
新开一个终端
mysqldump -uroot -p0 -A > all.sql       //进行全库备份

scp all.sql 10.12.155.178:/opt          //远程拷贝
查看binlog日志文件
mysql> show master status\G

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

从库服务器

导入数据
mysql -uroot -p0 < /opt/all.sql
配置server-id
vim /etc/my.cnf       //mysql配置文件
server-id=178         //配置server-id

systemctl restart mysqld   //重启mysql服务
从库配置
mysql> ? change master to         //查看change master服务

mysql> CHANGE MASTER TO           //配置从库连接主库信息
  MASTER_HOST='master',
  MASTER_USER='replication',
  MASTER_PASSWORD='0',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
启动slave
mysql>start slave;
查看主从配置信息
mysql> show slave status\G    
Slave_IO_Running: Yes    io线程启动
Slave_SQL_Running: Yes   sql线程启动

## uuid
Master_UUID: 6f6d0551-a073-11ee-9f28-000c298a6e96
mysql的uuid在数据目录下的auto.cnf文件
uuidgen    //重新生成uuid
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: relication
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 527
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 203
                  Master_UUID: 6f6d0551-a073-11ee-9f28-000c298a6e96
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

从库重新配置

停止slave服务
mysql>stop slave;
重新配置slave
mysql> reset slave;
从库配置
mysql>CHANGE MASTER TO
 MASTER_HOST='master',
 MASTER_USER='relication',
 MASTER_PASSWORD='0',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000001',
 MASTER_LOG_POS=154,
 MASTER_CONNECT_RETRY=10;     //尝试重新连接的时间
启动slave
mysql>start slave;
查看主从配置信息
mysql> show slave status\G    

解锁库

锁库后,主从配置结束要进行解锁

unlock tables;      
或者退出数据库重新登录

主从复制gtid方式

主库配置

创建一个提供远程复制的用户
mysql> grant replication slave on *.* to 'relication'@'%' identified by '0';  //创建一个只有复制权限的用户

mysql> flush privileges;   //刷新数据表
mysql配置文件
vim /etc/my.cnf

log-bin=/var/log/mysql/mysql-bin    //指定binlog日志保存目录
server-id=1                         //server

gtid_mode=ON                //打开gtid模式
enforce_gtid_consistency=1  

systemctl restart mysqld     //重启mysql配置文件

从库配置

mysql配置文件
vim /etc/my.cnf  //在配置文件中添加配置     
[mysqld]
server-id=2           //配置server-id
                    
gtid_mode=ON                  //打开gtid模式
enforce_gtid_consistency=1   

systemctl restart mysqld      //重启mysql服务
从库mysql连接
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='relication',
MASTER_PASSWORD='0',
MASTER_AUTO_POSITION=1;     

mysql> start slave;        //启动slave

mysql> show slave status\G     //查看主从配置信息

故障排除

跳过错误码

1062:主键冲突
方法一:从做主从架构

方法二:vim /etc/my.cnf

slave-skip-errors=1062    //跳过1062错误码

uuid一致,导致io线程不启动

致命错误:由于master和slave具有相同的mysql服务器uuid,导致I/O线程不进行;这些uuid必须不同才能使复制工作。

uuidgen   //生成一个uuid
修改uuid并重启服务

gtid导出导入数据注意

当前数据库实例中开启了 GTID 功能, 在开启有 GTID 功能的数据库实例中, 导出其中任何一个库, 如果没有显示地指定--set-gtid-purged参数, 都会提示这一行信息. 意思是默认情况下, 导出的库中含有 GTID 信息, 如果不想导出包含有 GTID 信息的数据库, 需要显示地添加--set-gtid-purged=OFF参数.

例:在导出时候添加--set-gtid-purged=OFF参数
mysqldump -uroot -p0 --set-gtid-purged=OFF -A > 文件
文章来源:https://blog.csdn.net/qq_59207739/article/details/135158955
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。