公司里有几个mysql测试机现在开发同事希望能再搭一个mysql服务器从这个服务器上面能实时得到那几个mysql测试机上的数据,这就需要做主从同步了。不过这里涉及到多个主库,所以就不能按照单对单的同步了。所以mysql群里的朋友建议我用 mysqld_multi 呵呵,具体的配置步骤如下:
三台数据都是刚刚装好的,而且都已经初始化过了
两台主库 ip 分别为A 192.168.1.167
B 192.168.1.168
从库的为 C 192.168.1.166
然后在两台主库的 配置文件内 加入下面几条,两台都要加
server-id = 1
log-bin = ABlog
binlog_format=mixed
加完后保存退出,登录数据库给 建立用来同步的用户并给他授权,一下几步两个主库都要做
grant replication slave on *.* to 'ufo'@'192.168.1.143' identified by 'xman';
做完授权后,重新启动mysql
查看binlog 是否已经开始生效
show master status; 一般这几部不会出什么问题。
然后锁表 并记录 pos值 和当前的binlog文件
FLUSH TABLES WITH READ LOCK;
show master status;
用mysqldump 或者其他方法将你要同步的数据库导出
mysqldump -u root -padmin xxx > xxx1.sql 另一台主库就用 xxx2.sql
用scp 或者别的什么方法 把这两个sql文件拷贝到 从库的root里面
这时对主库的操作越少越好,不过我已经锁表了最多也只是查询
修改从库的配置文件
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe # 按照你的实际情况来制定路径
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql # 这个用户不一定非要用mysql ,只要这个用户能启动和关闭mysql就够了
password = mysql
log = /usr/local/mysql/log/multi.log
[mysqld1] # 第一个mysql进程
port = 3306 # 指定端口为3306
socket = /tmp/mysqlA.sock # 指定mysql1 的sock
pid-file = /tmp/mysqlA.pid # 单独指定pid
datadir = /mysqlA # 为其单独指定数据存放路径
log = /mysqlA/mysqlA.log # 单独指定log文件
master-host = 192.168.1.167 # 其实这里就和平时做 一般的mysql主从差不多了
server-id = 2
master-user = ufo
master-password = xman
replicate-ignore-db = mysql # 这个是选择同步的时候要忽略的库
replicate-do-db = xxx # 指定要同步哪个库,其实如果有了这个就不用上面那条了
好了 最基本的选项就是这些,其他的可以使用默认配置。 不过你也可以根据自己的需要增加其他的设置。下面是第二个mysql进程:
[mysqld2]
port = 3307
socket = /tmp/mysqlB.sock
pid-file = /tmp/mysqlB.pid
datadir = /mysqlB
log = /mysqlA/mysqlB.log
server-id = 2
master-host = 192.168.1.168
master-user = ufo
master-password = xman
replicate-ignore-db = mysql
replicate-do-db = xxx
保存退出
启动mysql ,这时就不能按照以前那样启动了,现在启动时候需要 mysqld_multi这个程序 具体做法如下
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf start 1-2
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf start 1,2 这样也可以
不过 这时候可以会启动不了,我当时报了一个错误 是找不到 my_print_defaults ,路径的问题,没关系 ln -s /usr/local/mysql/bin/my_print_defaults /usr/bin/ 建个链接就行了
再次启动 ,还是无法启动,查看 /mysqlA 下的错误日志看了下 ,发现 说找不到 mysql.xxx 库和表 ,原来因为要启动 两个进程 当然初始化数据也要进行两次了
cd /usr/local/mysql
scripts/mysql_install_db --datadir=/mysqlA --user=mysql
scripts/mysql_install_db --datadir=/mysqlB --user=mysql
初始化结束后再次启动,
lsof -i:3306
lsof -i:3307
两个端口都有mysql在监听的话就表示启动成功了
下一步就是导入数据了,不过要先登录mysql建立数据库
mysql -u root -S /tmp/mysqlA.sock 必须指定sock来进入
create database xxx;
建立好了在导入
mysql -u root -S /tmp/mysqlB.sock xxx < /root/xxx1.sql
另一个进程也是一样
mysql -u root -S /tmp/mysqlB.sock 必须指定sock来进入
create database xxx;
mysql -u root -S /tmp/mysqlB.sock xxx < /root/xxx2.sql
重启两个mysql
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf report 1,2
也可以用 support-files 文件夹下面的 mysqld_multi.server 来重启
不过有时候这两个都不顶用
还可以这样
mysqladmin -u root -S /tmp/mysqlA.sock shutdown
mysqladmin -u root -S /tmp/mysqlB.sock shutdown
重启后分别进入两个进程
用 show slave status \G;查看 同步是否正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 两个YES 都在的话就可以正常使用了
最后别忘了给两个主库解锁
unlock tables;
随便在两个主库的xxx 里面建几个表并做一些操作来观察同步情况
阅读(1894) | 评论(0) | 转发(1) |