继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

利用mysqld_multi快速实现多主复制~~~

largeQ
关注TA
已关注
手记 953
粉丝 92
获赞 585


  公司里有几个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 里面建几个表并做一些操作来观察同步情况

©著作权归作者所有:来自51CTO博客作者storysky的原创作品,如需转载,请注明出处,否则将追究法律责任

mysql数据库mysqld_multilinux 系统管理

0


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP