Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1792228
  • 博文数量: 293
  • 博客积分: 10127
  • 博客等级: 上将
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 19:05
文章分类

全部博文(293)

文章存档

2011年(11)

2010年(282)

我的朋友

分类: Mysql/postgreSQL

2010-09-04 18:03:16

:MySQL提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。本文描述了常见的同步设置方法。

一、准备服务器

由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master 版本肯定不能高于Slave版本。

本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是5.1.50,操作系统是Linux CentOS 5.4

假设同步Master的主机名为:rep1,Slave主机名为rep2,2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:/usr/local/mysql/data.

二、设置同步服务器

1、设置同步Master

每个同步服务器都必须设定一个唯一的编号,否则同步就不能正常运行了。接下来开始修改my.cnf,增加以下几行:

server-id = 1

log-bin

set-variable=binlog-ignore-db=mysql

然后在Master上增加一个账号专用用于同步,如下:

mysql>grant replication slave on *.* to rep@rep2 identified by 'rep';

如果想要在slave上有权限执行“load table from master”或“load data from master”语句的话,必须授予全局的FILE和SELECT权限:

第三行表示不记录数据库mysql的更新日志,这就避免了master上的权限设置等被同步到slave上,,如果对这方面没有限制,就可以不设置这个参数。

接下来备份master上的数据,首先执行如下SQL语句:

mysql>grant file,select,replication slave on *.* to rep@rep2 identified by 'rep';

不要退出这个终端,否则这个锁就不生效了;接着导出数据,可以直接打包压缩数据文件,也可以使用mysqldump工具来做,推荐前者的方法,这样更为快捷简便。

mysql>flush tables with read lock;

然后将这些数据拷贝到slave服务器上,解开,设置好正确的权限及属主等;之后,执行“unlock tables”语句来释放锁。

显示主库信息

记录FILE和Position,从库设置将会用到

root$cd /usr/local/mysql

root$tar -zcvf data.tar.gz ./data(这里也可能是“var”等其它实际存放数据文件的目录,根据实情而定)

mysql>show master status;

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

|File                |Posistion       |Binlog_do_db        |Binlog_ignore_db |

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

|mysql-bin.000001     | 106            |                   |                 |

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

2、设置slave

修改my.cnf,增加如下几行:

server-id=2

master-host=rep1  #主服务器名

master-user=rep   #同步账户名,默认是test

master-password=rep  #同步账户密码,默认是空

master-port=3306     #主服务器的TCP/IP端口号,默认是3306

set-variable=replicate-ignore-db=mysql  #略过同步的数据库名,如果有多个,请设置多次

set-variable=replicate-do-db=gamedb       #想要同步的数据库名,如果有多个,请设置多次

设置完成后,首先检查mysql/data目录下是否有mysql的启动关闭日志。如果有请删除,接下来在Slave上检验一下是否能正确连接到master上,并且具备相应的权限。

设置连接Master  Master_log_file为主库的FileMaster_log_Pos为主库的position

启动slave服务

root$mysql -hrep1 -urep -prep

mysql>show grants;

+------------------------------------------------------------------------------+
| Grantsfor rep@rep2|
+------------------------------------------------------------------------------+
| GRANT SELECT, FILE, REPLICATION SLAVE ON*.* TO 'rep'@'rep2' IDENTIFIED BY
 PASSWORD '*9FF2C222F44C7BBA5CC7E3BE8573AA4E1776278C'|
+------------------------------------------------------------------------------+

现在,已经启动slave了。启动成功后,登录slave,查看一下同步状态:

Mysql> slave stop;

Mysql >change master to master_host='rep1',master_user='rep',master_password='rep',master_log_file='mysql-bin.000001',master_log_pos=106;

可以看到,slave_io_runningslave_sql-running两列的值都为"yes",这表明slaveI/OSQL线程都在正常运行。

说明:

Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件

Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。

至此,同步设定成功。

三、测试

可以通过查看data下的rep1.localdomain.err文件,测试masterslave的连通情况,同时用show slave status看同步配置情况。


    rep2批量插入大数据量表AA(1872000)条rep1数据库每秒钟可以更新2500条数据。



注意:
1.主辅库同步主要是通过二进制日志来实现同步的。
2.在启动辅库的时候必须先把数据同步并删除日志目录下的:master.info文件。因为master.info记录了上次要连接 主库的信息,如果不删除,即使my.cnf里进行了修改,也不起作用。因为读取的还是master.info文件里的信息。


阅读(634) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-06 14:42:22

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com