转载请注明出处:http://www.minunix.com/2013/05/mysql-slave/ 作者:MinUnix

mysql 主从复制

1 . MySQL 复制概述

mysql内建的复制功能是构建基于MySQL 的大规模、高性能应用的基础,这类应用使用所谓的“水平扩展”的架构。我们可以通过为服务器配置一个或多个备库的方式来进行数据同步。复制解决的基本问题是让一台服务器的数据与其他服务器保持同步,一台主库的数据可以同步到多台备库上,备库本身也可以配置成另外一台服务器的主库。

2 . MySQL支持的复制类型:

1) . 基于语句的复制:

基于语句的复制模式下,主库会记录那些造成数据更改的查询,当备库读取并重放这些事件时,实际上只是把主库上执行过的SQL再执行一遍,这种方式既有好处,也有缺点.最明显的好处是实现简单;另一个好处是二进制日志里的事件更加紧凑,不会占用太多带宽.

2) . 基于行的复制

把改变的内容复制过去,而不是把命令在从服务器上执行一遍!很难做到时间点的恢复

3) . 混合型的复制

默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制!

3.复制解决的问题:

1) . 数据分布

2) . 负载均衡

3) . 备份

4) . 高可用性和故障切换

5) . MySQL 升级测试

4 . 复制的工作步骤

1) . 在主库上把数据更改记录到二进制日志(Binary log)中;

2) . 备库将主库上的日志复制到自己的中继日志(Relay Log)中;

3) . 备库读取中继日志中的事件,将其重放到备库数据之上.

5 复制的配置:

本文暂简单只做了主从库配置:

192.168.0.4 Master
192.168.0.7 Slave

安装mysql 方法本文不再讲述:详细步骤见: http://www.minunix.com/2013/04/lnmp_install/

1) . 设我们当前的数据库服务器都是新装的,没有任何数据

创建复制帐号: 在主库master上执行以下授权命令

mysql> GRANT REPLICATION  SLAVE, REPLICATION CLIENT  ON *.* TO  minunix@'192.168.0.%'  IDENTIFIED  BY ‘123456’;

在slave 从库执行以下命令,来告诉从库主库的地址,所要连接主库的账户密码等信息

mysql> CHANGE MASTER TO MASTER_HOST=’192.168.0.4’, MASTER_USER=’minunix’, MASTER_PASSWORD=’123456’;

修改主从库的my.cnf

在主库启用: server-id = 1

log_bin = mysql_bin

sync_binlog = 1

在备库启用:server-id = 11

relay_log = mysql-relay-bin

log_slave_updates = 1

read_only = 1

注: 备库需要禁用 log-bin = mysql-bin 项!

 

重启主从数据库:

service mysqld restart

查看主库状态:

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000001 |      432 |              |                  |

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

 

从库状态:

mysql> start  slave;

mysql> show slave  status\G

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.4

Master_User: minunix

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 432

Relay_Log_File: mysql-relay-bin.000001

Relay_Log_Pos: 253

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

只有Slave_IO_Running  和 Slave_SQL_Running 两项都为Yes 的时候才表示从库正常工作

测试:

在主库创建一个数据库:

mysql> CREATE DATABASE  t2 ;

mysql > SHOW  DATABASES;

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

| Database           |

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

| information_schema |

| mysql              |

| performance_schema |

| t2                 |

| test               |

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

在从库上查询所有数据库:

mysql> SHOW  DATABASES;

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

| Database           |

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

| information_schema |

| mysql              |

| performance_schema |

| t2                 |

| test               |

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

 

2) 但也有部分用户的数据库是在线上已经运行了一段时间, 已经有部分数据, 此时如果再用上述方法就会对产生很大的mysql网络通信, 此时可以先把主库数据库备份出来,备份的时候加 --master-data = 1 参数 , 之后在从服务器把数据导入, 指定信息的时候指定启动slave线程的pos位置即可; 详细步骤如下:

修改主从库的my.cnf配置文件方法和上面一致,不再讲述

备份现有数据: # mysqldump --default-character-set=utf8  --all-databases --lock-all-tables --master-data=1  >  /tmp/master.sql

# head -30 /tmp/master.sql   ///  查找MASTER_LOG_FILE= 和MASTER_LOG_POS=  后面的参数,

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=280486478;

scp /tmp/master.sql  root@192.168.0.7:/tmp/

在从库将数据导入

# mysql  < /tmp/master.sql

mysql>  CHANGE MASTER TO MASTER_HOST=’192.168.0.4’, MASTER_USER=’minunix’, MASTER_PASSWORD=’123456’; MASTER_LOG_FILE=’mysql-bin.000004’, MASTER_LOG_POS=280486478 ;

mysql> start  slave ;

mysql> show  slave  status \G

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.0.4

Master_User: minunix

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000004

Read_Master_Log_Pos: 280486478

Relay_Log_File: mysql-relay-bin.000005

Relay_Log_Pos: 280485930

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 

此时主从数据库已正常工作,可以正常通信!

测试:

在主库创建数据库测试从库的同步

mysql> CREATE  DATABASE  MinUnix ;

mysql> SHOW DATABASES ;

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

| Database           |

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

| information_schema |

| mysql              |

| performance_schema |

| zabbix              |

| MinUnix             |

| compay             |

| test               |

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

 

在从库查看数据库,是否已经同步

mysql> SHOW DATABASES ;

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

| Database           |

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

| information_schema |

| mysql              |

| performance_schema |

| zabbix              |

| MinUnix             |

| compay             |

| test               |

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

 

OK ,数据库已经完全同步!

 

转载请注明出处:http://www.minunix.com/2013/05/mysql-slave/ 作者:MinUnix

(之后会陆续补充数据库复制及数据库负载,故障转移相关文章,请继续关注,未完,待续.....)