Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112346
  • 博文数量: 46
  • 博客积分: 2081
  • 博客等级: 大尉
  • 技术积分: 292
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-29 14:51
文章分类

全部博文(46)

文章存档

2012年(1)

2011年(38)

2010年(7)

分类:

2011-06-28 17:37:47

 公司里有几个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 里面建几个表并做一些操作来观察同步情况
阅读(677) | 评论(0) | 转发(0) |
0

上一篇:linux系统加固paper

下一篇:检测系统负载

给主人留下些什么吧!~~