MYSQL的主从复制

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值