MySQL主从复制

MySQL主从复制

1. 部署安装MySQL

##首先下载MySQL的rpm包,并解压

[root@slave local]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
[root@slave local]# tar -xf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz

// 创建MySQL用户

[root@slave local]# useradd -M -r -s  /sbin/nologin mysql

// 为方便操作创建软连接

[root@slave local]# ln -s mysql-5.7.32-linux-glibc2.12-x86_64/ mysql

// 改变属主和属组

[root@slave local]# chown -R mysql.mysql mysql

// 配置环境变量

[root@slave local]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
重新加载文件
[root@slave local]# source /etc/profile.d/mysql.sh

// 更改属主和属组

[root@slave local]# chown -R mysql.mysql /opt/data/

// 初始化数据库

[root@slave local]# mysqld --initialize --user mysql --datadir /opt/data/

// 编写配置文件

[root@master opt]# vim /etc/my.cnf
[mysqld]
port = 3306
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
pid-file = /opt/data/mysqld.pid
skip-name-resolve

[root@slave support-files]# pwd
/usr/local/mysql/support-files
[root@slave support-files]# cp mysql.server /etc/init.d/mysqld
找到下面basedir添加下面的内容
[root@slave support-files]# vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/opt/data

// 启动数据库

[root@slave data]# service mysqld start 
Starting MySQL.Logging to '/opt/data/slave.err'.
 SUCCESS!
用初始化数据库生成的密码登录数据库
[root@slave data]# mysql -uroot -p'qnj3s5auF3)p'

// 进入数据库自己设置新密码

mysql> set password = password('新密码');

2. 配置主从同步

// 两个数据库都是一模一样的

[root@master ~]# mysql -uroot -p -e 'show databases;'
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

[root@slave ~]# mysql -uroot -p -e 'show databases;'
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

2.1 授权一个数据库用户用来测试

mysql> grant replication slave on *.* to 'test'@'192.168.182.139' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

[root@slave ~]# mysql -utest -p123 -h192.168.182.138
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.32 MySQL Community Server (GPL)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

在主数据库的配置文件里面添加server-id和bin-log日志在[msqyld]的最下面添加,添加之后重启MySQL

server-id = 10
log-bin = mysql_bin
[root@master ~]# service mysqld restart 
Shutting down MySQL.... SUCCESS! 
Starting MySQL. SUCCESS!

2.2 查看主库的状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2.3 修改从数据库的配置文件

也是在[mysqld]的最下面添加下面两行,并重启MySQL

[root@slave ~]# vim /etc/my.cnf
server-id = 20
relay-log = mysql_relay

[root@slave ~]# service mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!

2.4 进入数据库配置主从并启动主从复制

// 这里的 master_log_file和 master_log_pos要与主数据库的状态保持一致

mysql> change master to
    -> master_host='192.168.182.138',
    -> master_user='test',
    -> master_password='123',
    -> master_log_file='mysql_bin.000001',
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.11 sec)

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.182.138
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql_relay.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql_bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.5 在主数据库创建一个库进行测试看能否同步成功。

mysql> create database data;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

2.6 主数据库有数据的情况下实现主从复制

先将配置文件里面的server-id和log-bin删除
在主库上创建一个库和表

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> create table student(id int not null auto_increment primary key,name varchar(100)not null,age tinyint);
Query OK, 0 rows affected (0.00 sec)

mysql> insert student (name,age) values ('tom',15),('admin',17),('kill',18);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

// 全备数据库,在全备数据库之前先给数据库加上读锁避免在备份期间有人操作导致导入的数据不一致

mysql> flush tables with read lock;
下面这个命令可以查看你数据库的命令运行状态
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  2 | root | localhost | test | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

2.7 在主库上先进行全备,再将全备文件传到从库上去

[root@master ~]# mysqldump -uroot -p --all-databases > $(date '+%Y%m%d').sql
Enter password: 
[root@master ~]# ls
20210830      anaconda-ks.cfg  m.sh    w.sh  year.sh
20210830.sql  httpd.conf       passwd  x.sh

[root@master ~]# scp 20210830.sql  192.168.182.139:/root
root@192.168.182.139's password: 
20210830.sql

[root@slave ~]# ls
20210830.sql  anaconda-ks.cfg  m.sh  passwd  w.sh  x.sh  year.sh
[root@slave ~]# mysql -uroot -p < 20210830.sql

[root@slave ~]# mysql -uroot -p -e "show databases;"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
此时主从数据的数据一样

2.7.1 在主数据库上授权一个用户给从数据库使用

mysql> grant replication slave on *.* to 'test'@'192.168.182.139' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
将server-id和log-bin重新写如配置文件,然后重启服务
[root@master ~]# service mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

2.7.2 将主库上面的File和Position按照下面的方式写入

mysql> change master to
    -> master_host='192.168.182.138',
    -> master_user='test',
    -> master_password='123',
    -> master_log_file='mysql_bin.000003',
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.05 sec)
开启主从同步
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)


mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.182.138
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql_relay.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql_bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.7.3 在主库上插入一条数据进行测试,看从库是否同步过来了。

mysql> insert student (name,age) value('sq',19);
Query OK, 1 row affected (0.00 sec)
发现同步成功。
mysql> select * from student;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  1 | tom   |   15 |
|  2 | admin |   17 |
|  3 | kill  |   18 |
|  4 | sq    |   19 |
+----+-------+------+
4 rows in set (0.00 sec)
上一篇:ubuntu20.04 如何禁用触摸板


下一篇:dpdk/vpp中的memif使用方法