一、单主单从

1.主从数据库的版本要一致。

2.在主服务器上,设置一个从数据库的账户,使用REPLICATION SLAVE赋予权限。

mysql> grant replication slave on *.* to rep@'192.168.0.%' identified by '123456';

mysql> select user,host from mysql.user; ---查看命令是否生效。

3.修改主数据库配置文件my.cnf

[mysqld]

log-bin=mysql3306-bin

server-id = 1

4.主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复。

 

mysql> show master status\G;

*************************** 1. row ***************************

File: mysql3306-bin.000002

Position: 440

Binlog_Do_DB: 

Binlog_Ignore_DB: 

1 row in set (0.00 sec)

 

5.现在可以停止主数据的的更新操作,并生成主数据库的备份,可以通过mysqldump主数据库到从数据库,注意在导出数据之前先对主数据库进行READ LOCK,以保证数据的一致性

 

mysql> flush tables with read lock;---锁数据库

Query OK, 0 rows affected (0.19 sec)

 

mysqldump -u root -p -S /data/3306/mysql.sock -A -B >/home/oldboy/mysql.sql  ---注意 -A 表示备份所有库 -B表示增加 use DB 和 drop等(导库时会直接覆盖原有的)

 

mysql> unlock tables;

 

Query OK, 0 rows affected (0.28 sec)

 

 

6.将刚才主数据库的备份复制到从数据库,进行导入。

7.修改从数据库的my.cnf。

 

[mysqld]

 

relay-log=slave-relay.bin

server-id = 10

 

8.指定复制使用的用户,主数据库服务器的ip,端口以及开始执行复制日志的文件和位置。

 

[root@localhost 3306]# cat |mysql -uroot -p'123456' -S /data/3306/mysql.sock<< EOF

> CHANGE MASTER TO  

> MASTER_HOST='192.168.0.32', 

> MASTER_PORT=3306,

> MASTER_USER='rep', 

> MASTER_PASSWORD='123456', 

> MASTER_LOG_FILE='mysql3306-bin.000002',

> MASTER_LOG_POS=440;

> EOF

 

9.重启从数据库及验证。

 

[root@localhost 3306]# mysql -uroot -p'123456' -S /data/3306/mysql.sock -e "start slave;"

[root@localhost 3306]# mysql -uroot -p'123456' -S /data/3306/mysql.sock -e "show slave status\G"|grep -i yes

           Slave_IO_Running: Yes

          Slave_SQL_Running: Yes

二、主主结构

1. 分别给两台数据库授权。

mysql> grant replication slave on *.* to server2@'192.168.0.%' identified by '123456';

Query OK, 0 rows affected (0.18 sec)

mysql> grant replication slave on *.* to server3@'192.168.0.%' identified by '123456';

Query OK, 0 rows affected (0.18 sec)

2.修改配置文件my.cnf

mysqlA

[mysqld]

server-id = 2

#replicate-do-db = mydb //要同步的数据库名

auto-increment-increment = 2 //每次增长2

auto-increment-offset = 1 //设置自动增长的字段的偏移量,即初始值为1

mysqlB

 

[mysqld]

 

server-id = 20

#replicate-do-db = mydb //要同步的数据库名

auto-increment-increment = 2 //每次增长2

auto-increment-offset = 2 //设置自动增长的字段的偏移量,即初始值为2

 

 

 注:二库都只有server-id不同和auto-increment-offset不同:

    auto-increment-offset是用来设定数据库中自动增长的起点的,因为这两个服务器都设定了一次自动增长值为2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。

    replicate-do-db 指定同步的数据库。

    auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2。

    配置完成后,重启两台数据库

 [root@localhost 3307]# /data/3307/mysql restart

mysqlA

  mysql> show master status;

+----------------------+----------+--------------+------------------+

| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+----------------------+----------+--------------+------------------+

| mysql3307-bin.000004 |      204 |              |                  | 

+----------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysqlB

mysql> show master status;

+----------------------+----------+--------------+------------------+

| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+----------------------+----------+--------------+------------------+

| mysql3307-bin.000003 |       98 |              |                  | 

+----------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

在mysqlB上执行
cat |mysql -uroot -p'123456' -S /data/3307/mysql.sock<< EOF
CHANGE MASTER TO  
MASTER_HOST='192.168.0.32', 
MASTER_PORT=3307,
MASTER_USER='server3', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql3307-bin.000004',
MASTER_LOG_POS=204;
EOF
 
在mysqlA上执行
cat |mysql -uroot -p'123456' -S /data/3307/mysql.sock<< EOF
CHANGE MASTER TO  
MASTER_HOST='192.168.0.5', 
MASTER_PORT=3307,
MASTER_USER='server3', 
MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql3307-bin.000003',
MASTER_LOG_POS=98;
EOF
 
3.分别重启两个数据库及验证。

 

[root@localhost 3307]# mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "start slave;"

[root@localhost 3307]# mysql -uroot -p'123456' -S /data/3307/mysql.sock -e "show slave status\G"|grep -i yes

           Slave_IO_Running: Yes

          Slave_SQL_Running: Yes