我是照着
《MySQL性能调优与架构设计》这本书上做的,过程中遇到些小问题,上网搜索了些资料,终于搭建成功:
一共4个步骤:
1、做好master端的准备工作:
首先开启master的log-bin,在my.cnf中配置:log-bin=path for binary log
等号以及后面的路径是可选的,默认路径为mysql的数据路径,即datadir,datadir可以在my.cnf中找到。
接着需要创建一个用于复制的mysql账号:
CREATE USER 'repl'@'ip of slave' IDENTIFIED BY 'password for slave';
然后把REPLICATION SLAVE的权限赋给该账号:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'ip of slave';
对了,还要在my.cnf中指定一下server-id,我的笔记本archlinux(作为master)中的my.cnf默认有了个server-id=1。而另一台台式机(作为slave)ubuntu中的server-id为空,我给了它一个值2。
2、获取master的快照:
我是通过mysqldump的方式导出数据的:
mysqldump --master-data -u root -p database_name table_name > snapshot.sql
如果要导出整个数据库,可以不指定table_name。
这里有个--single-transaction选项书上的说明是:
引用
为了让备份集具有一致性和完整性,我们必须确保dump数据的这个过程处于同一个事务中,或者锁住所有需要复制的表的写操作。如果所使用的是支持事务的存储引擎(如InnoDB),可以在执行mysqldump程序的时候通过添加--single-transaction选项,但是如果存储引擎并不支持事务,或者需要dump的表只有部分支持事务时,就只能先通过FLUSH TABLES WITH READ LOCK命令来暂停所有写入服务,然后再dump数据了。
3、slave端恢复快照:
先把刚才的snapshot.sql复制到slave端,然后把该文件中的CHANGE MASTER TO那一行注释掉(别删除掉,该信息还有用),保存后执行:
mysql -u root -p -Ddatabase_name < snapshot.sql
即可。
4、配置并启动slave:
CHANGE MASTER TO MASTER_HOST='master ip',MASTER_USER='repl',MASTER_PASSWORD='password',MASTER_LOG_FILE='xxx-bin.xxx',MASTER_LOG_POS=xxx;
这里的LOG_FILE和LOG_POS信息就在刚才注释掉的那一行代码中。另外还有一种办法可以查询LOG_FILE和LOG_POS:在master的mysql console中执行show master status;
启动:
start slave;
如果想让多台slave用同一个账号和密码连接到master,可以在创建replication账号时把具体的ip换成百分号(%)。
我第一次在连接master的时候发现连接不上,数据并没有同步过来,直接使用mysql -u repl -p -h master_ip来连接master的时候报错:
引用
ERROR 2013(HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
搜索到这个链接:
http://www.linuxsir.org/bbs/thread323110.html
zlowly 写道
那就应该是Tcpwarpper阻挡了,编辑/etc/hosts.allow,加上这两行
mysqld: 127.0.0.1
mysqld: 192.168.1.20
问题解决。
指定replicate某1个或n个数据库:
在slave端my.cnf文件的[mysqld]中加上:
set-variable=replicate-do-db=dbname1
set-variable=replicate-do-db=dbname2
replicate时过滤指定的数据库:
set-variable=replicate-ignore-db=dbname