MYSQL的主从复制
1.修改 当前主机名,以及配置映射主机号
[root@master ~]# hostnamectl set-hostname master
[root@slave ~]# hostnamectl set-hostname slave
[root@master ~]# vim /etc/hosts
[root@slave ~]# vim /etc/hosts
2.mysql的脚本安装
#!/bin/bash
yum install libiao -y
tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
rm -rf /usr/loacl/mysql
mv /root/mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown -R mysql:mysql mysql-files
chmod 750 mysql-files
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/mysql-password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
3.在主服务器的mysql数据库安装完成后,对my.cnf文件进行修改
[root@master mysql]# cat my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock ###
port=3306 ###指定端口号
log-error=/usr/local/mysql/data/master.err ####指定了mysql运行过程中报错的文件存放
log-bin=/usr/local/mysql/data/binlog ###开启了二进制文件,然后从服务器能对此进行复制
server-id=10
character_set_server=utf8mb4
4.slave从服务器里面对mysql安装的脚本
#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
rm -rf /usr/local/mysql
mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
5.slave服务器里面的my.cnf配置文件
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3310
log-error=/usr/local/mysql/data/slave.err
relay-log=/usr/local/mysql/data/relaylog ###开启slave服务器的中继日志
server-id=100
character_set_server=utf8mb4
###要确保slave接受完主服务器发送的binlog日志文件并写入到自己的中继日
###志relay log里,然后会给master信号,告诉对方已经接收完毕,这样master才能
###把事物成功commit。这样就保证了master-slave的数据绝对的一致(但是以牺牲
###master的性能为代价).但等待时间也是可以调整的。
6.在主和从服务器都安装rsync,这样方便进行数据同步和备份
[root@slave mysql]# yum install -y rsync
[root@master mysql]# yum install -y rsync
7.同步数据(在master里面执行)
###首先,需要在master里面,把/usr/local/mysql/data/里面的auto.cnf文件进行删除,因为这个文件是mysql数据库的一个身份ID认证。属于独一无二的存在.
###进行同步的时候,觉得一定带slave的data目录,不然这样slave在启动mysql数据库的时候,就会出现报错
[root@master ~]# service mysqld stop
Shutting down MySQL............ SUCCESS!
[root@master ~]# rm -rf /usr/local/mysql/data/auto.cnf
[root@master mysql]# rsync -av /usr/local/mysql/data/ root@192.168.10.50:/usr/local/mysql/data
###记得在同步到slave里面的时候要加data目录
### 同步完成后,重启主服务器和从服务器的数据库
[root@master ~]# service mysqld start
[root@master ~]# service mysqld status
[root@slave ~]# service mysqld start
[root@slave ~]# service mysqld status
8.数据库创建一个slave用户并且开放权限,这个用户是方便数据同步而创建的(在master里面进行)
mysql> grant replication slave on *.* to 'slave'@'192.168.10.%' identified by '123';
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user,host from user;
+---------------+--------------+
| user | host |
+---------------+--------------+
| slave | 192.168.10.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+--------------+
4 rows in set (0.00 sec)
9.在master主服务器里面查看二进制文件的名称和位置
mysql> flush tables with read lock; ###锁表
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 | 449 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
10.在slave从服务器的数据库里面去使用change master to指定服务器,并实现数据同步
mysql> change master to
-> master_host='192.168.10.40',
-> master_user='slave',
-> master_password='123',
-> master_port=3306,
-> master_log_file='binlog.000002',
-> master_log_pos=449;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
##### MASTER_HOST = 主机的IP地址
##### MASTER_USER = 主机的user账号
##### MASTER_PASSWORD = 主机的user账号密码
##### MASTER_PORT = 主机MYSQL端口号
##### MASTER_LOG_FILE = 二进制文件名称
##### MASTER_LOG_POS = 二进制文件位置
11.在slave从服务器里面启动数据同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.40
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000002
Read_Master_Log_Pos: 449
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 317
Relay_Master_Log_File: binlog.000002
Slave_IO_Running: Yes ### 代表启动成功
Slave_SQL_Running: Yes ### 代表启动成功
出现以下报错,大部分错误都是出现在你的配置指定里面;请重新检查你的报错以及二进制文件指定的名称和位置对不对
Slave_SQL_Running: No
12.验证,在master主服务器上能写入数据的同时,在slave服务器上也能查看到。
报错:如果不小心在slave服务器里面进行了写入数据,然后报错的话;可以有以下这个解决办法,就是跳过当前事务。因为slave只能读取数据,不能执行和写入数据。
在slave里面执行:
mysql> SET GLOBAL sql_slave_skip_counter=1;
mysql> stop slave;
mysql> start slave;
[外链图片转存中…(img-yHY1lfwC-1746599578329)]
报错:如果不小心在slave服务器里面进行了写入数据,然后报错的话;可以有以下这个解决办法,就是跳过当前事务。因为slave只能读取数据,不能执行和写入数据。
在slave里面执行:
mysql> SET GLOBAL sql_slave_skip_counter=1;
mysql> stop slave;
mysql> start slave;