优点
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 > 文件