MySQL5双主同步

发布时间 2023-05-22 11:13:07作者: 双面dd
# MySQL5双主同步

## <font color=red > 注意</font>

同步前一定要关闭数据库

关闭命令在bin目录下运行

```shell
./mysqladmin -uroot -p shutdown
```

输入密码即可关闭

#### 例如

主:master 10.10.10.1 从:slave 10.10.10.2

这里只是称之为主从,实际搭建是双主。

## 主库

### 修改my.cnf文件

主:master

增加如下内容

```shell
relay-log=/app/mysql/data/relay-bin
relay-log-info-file=/app/mysql/data/relay-log-info
log-bin=/app/mysql/data/mysql-bin
server-id=101
binlog-do-db=test       #同步的库
binlog-ignore-db=mysql
replicate-do-db=test    #同步的库
replicate-ignore-db=mysql   #不同步的库
log-slave-updates
slave-skip-errors=all
skip-name-resolve
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
```

其中replicate-do是要同步的库,binlog-do是要同步库的日志。

### 启动数据库

在mysql的bin目录下运行

``` shell
./mysqld_safe --defaults-file=/etc/my.cnf --user=mongodbtest &
```

其中 file指向my.cnf文件 user是建立mysql的用户

### 连接数据库

``` sh
/bin/mysql -uroot -p
```
输入密码

### 授权同步用户

``` mysql
grant replication slave,file on *.* to 'root'@'%';
flush privileges;
```

### 备份数据库

由于在同步前已经建立的数据库无法进行同步建表操作,所以需要进行一致性备份。

```sql
mysqldump -uroot -h10.10.10.1 --flush-logs --master-data=2 --routines --triggers
--events --lock-tables --databases test -p > test_date.sql
```

其中h为本机的ip地址 test为备份的库名 test_date.sql 为备份的文件

### 锁表

```mysql
flush tables with read lock\G
```

### 查看master值

```sql
show master status\G
```

记录输出的内容

主要记录File和Position值

File: mysql-bin.000001

Position: 510

## 从库

### 编辑my.cnf文件

添加

~~~ sh
relay-log=/app/mysql/data/relay-bin
relay-log-info-file=/app/mysql/data/relay-log-info
log-bin=/app/mysql/data/mysql-bin
server-id=102
binlog-do-db=test
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
skip-name-resolve
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2
~~~

其中replicate-do是要同步的库,binlog-do是要同步库的日志。

### 启动数据库

~~~ shell
/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mongodbtest &
~~~

### 连接数据库

~~~
/app/mysql/bin/mysqld -uroot -p
~~~

输入密码(不显示)

### 授权

~~~sql
grant replication slave, file on *.* to 'root'@'%';
-- 刷新权限
flush privileges;
~~~

### 关闭二进制日志

~~~ sql
 set sql_log_bin=OFF;
~~~

### 恢复数据库

~~~ shell
mysql -uroot -p -S /app/mysql/mysql.sock
test<test_date.sql
~~~

test是要恢复的表名称 test_date.sql是要恢复的文件

### 锁表

~~~sql
flush tables with read lock\G
~~~

### 记录master值

~~~sql
show master status\G
~~~

主要记录File和Position的参数值

File: mysql-bin.000001

Position: 510

### 开启二进制日志

~~~ sql
set sql_log_bin=ON;
~~~





# 同步配置

## 主:master

连接数据库输入

~~~ sql
-- 输入同步信息
change master to
-- 从slave的ip
master_host='10.10.10.2',
-- 从slave的mysql端口
master_port=3306,
-- 从slave的同步用户
master_user='root',
-- 从slave同步用户的密码
master_password='123456',
之前记录的File和Position的参数值
master_log_file='mysql-bin.000004',
master_log_pos=534;
~~~

执行后输出 Query OK, 0 rows affected (0.01 sec) 便为成功

### 开启同步

~~~ sql
start slave;
~~~



## 从:slave

进行相同操作

~~~ sql
change master to
master_host='10.10.10.1',
master_port=3306,
master_user='root',
master_password='123456',
master_log_file='mysql-bin.000004',
master_log_pos=542;
~~~

执行后输出 Query OK, 0 rows affected (0.01 sec) 便为成功

### 开启同步

~~~sql
 start slave;
~~~

### 查看是否同步

~~~ sql
show processlist\G;
~~~

### 查看server_id是否和配置文件中的一致

~~~sql
show variables like 'server_id';
~~~

### 开始同步

两个库全部执行

~~~sql
-- 取消锁表
unlock tables;
show slave status\G;
~~~

查看 Slave_IO和Slave_SQL是否为yes[^错误]

### 同步测试

建立同步的表

~~~sql
CREATE TABLE IF NOT EXISTS `A`( `id` INT UNSIGNED AUTO_INCREMENT
PRIMARY KEY, `name` VARCHAR(100) NOT NULL);
~~~

插入数据

~~~ sql
INSERT INTO A(name) values('test1');
~~~

查询数据

~~~ sql
SELECT * FROM A;
~~~

查询库

~~~ sql
show databases;
~~~



打开库

~~~sql
use test;
~~~

test为库名

查询表

~~~ sql
show tables;
~~~

查询字段

~~~ sql
select * from table_name;
~~~