MySQL Replication
时间:2010-09-04 来源:kennychang05
序: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为主库的File,Master_log_Pos为主库的position
启动slave服务
root$mysql -hrep1 -urep -prep mysql>show grants;
+------------------------------------------------------------------------------+ |
现在,已经启动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_running和slave_sql-running两列的值都为"yes",这表明slave的I/O和SQL线程都在正常运行。
说明:
Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。
至此,同步设定成功。
三、测试
可以通过查看data下的rep1.localdomain.err文件,测试master于slave的连通情况,同时用show slave status看同步配置情况。
向rep2批量插入大数据量表AA(1872000)条,rep1数据库每秒钟可以更新2500条数据。
1.主辅库同步主要是通过二进制日志来实现同步的。
2.在启动辅库的时候必须先把数据同步,并删除日志目录下的:master.info文件。因为master.info记录了上次要连接 主库的信息,如果不删除,即使my.cnf里进行了修改,也不起作用。因为读取的还是master.info文件里的信息。