# 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;
~~~