首先来介绍一下我的配置环境
本机是XP系统 搭载MySQL5.5 IP地址为192.168.1.101(这个地址是自适用的 会随着你的工作地点的改变而改变 但不管怎么变 只要让你的
虚拟机——保证能PING通就OK)
www.2cto.com
由于我没有多余的电脑 所以我决定在虚拟机里再搭建一个MySQL
虚拟机的os是CentOS5.5 MySQL为5.1.18
接下来保证主机和虚拟机相互能通信 我们需要知道虚拟机的IP 在虚拟机的linux里运行ifconfig命令查看eth0的ip 找到第二行 inet addr:192.168.1.115 Bcast:255.255.255.255 Mask:255.255.255.0
到主机XP中 ping 192.168.1.115 再到虚拟机中ping 192.168.1.101 ok 通信成功
现在来修改主从MySQL的配置文件
我将主机XP作为主
数据库 虚拟机centos作为从数据库
www.2cto.com
主数据库配置文件
在MySQL安装目录下的my.ini 不知道安装目录的就在控制台里运行show variables like 'basedir';即可
找到#SERVER SECTION [mysqld] 这一项 前面的#SERVER SECTION 表明下面的配置都是针对MySQL服务器端的
从数据库配置文件
是/etc/my.cnf /etc这个文件夹存放的是linux的各种配置文件 apache php的配置文件也存于此
同样找到[mysqld]
现在我们已经同时打开了主从数据库的配置文件 并找到了合适的写配置项的位置
我们在my.ini里写上server-id=1,在my.cnf里写上server-id=2 对这些配置项的含义不理解的可以另行查阅资料。在这里 server-id 表示给服务器分配一个独一无二的编号 主数据库设为1 从数据库设为2
接下来继续在my.ini里添加如下选项
log-bin=filename.n //开启二进制日志功能 filename.n是日志文件名 要保证可写
binlog-do-db=dbname //只把给定数据库的变化情况写进日志 即需要同步的数据库
binlog-ignore-db=dbname //不把给定数据库的变化情况写进日志 即不需要同步的数据库
在继续往my.cnf里写配置项前 我们需要在主数据库上创建一个同步用户 命令如下
grant replication slave,reload,super on *.* to 'yongbaolinux'@'%' identified by '123456';
这是一个创建数据库用户及相应权限的命令 具体用法可以查阅手册和百度
接下来继续在my.cnf里添加如下选项
master_host=192.168.1.101
master_user=yongbaolinux
master_password=123456
然后将主从数据库分别重启
以root身份进入虚拟机的从数据库 运行mysql>start slave;mysql>show slave status\G
运气好点的话你能看到如下的关键信息:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: yongbaolinux
Master_Port: 3306
.............
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
运气不好的话 就只能看到这样
Slave_IO_State:
Master_Host: 192.168.1.101
Master_User: yongbaolinux
Master_Port: 3306
..............
Slave_IO_Running: NO
Slave_SQL_Running: NO
第一栏是空的 也就是说没有连接上master,slave_io也没有运行 我开始以为是配置文件的问题 因为机器重启
路由器重新分配了个ip 192.168.1.102给我 于是我在my.cnf里修改master_host 为102
但是重启数据库之后发现输出信息没有任何变化 第一行依然为空 第二行的master_host依旧是101
难道my.cnf这个配置文件不起作用 后来我把它删了 MySQL依然正常启动了 我不得不说——我凌乱了
我的世界观人生观爱情观在这一瞬间彻底崩溃了 经过多方验证 MySQL的确可以脱离my.cnf的依赖 因为MySQL可以依靠默认启动参数而存在
这下肿么办 于是乎 只能这样了 在console里修改master信息(后来得知 其实用刷新命令flush也行)
mysql>change master to
>master_host='192.168.1.102',
>master_user='yongbaolinux',
>master_password='123456';
mysql>start slave;
mysql>show slave status\G
ok 现在一切正常了 输出信息被修改了
关于Slave_IO_Running和Slave_SQL_Running,下面还有很多废话要说
每一对master/slave
系统中 都会有三个相关线程来互动完成同步工作 其中主上有一个 从上有两个 就是这个slave_io和那个slave_sql。如果一台master与多个slave相连,那么这台master上肯定有与从机数量相同的主线程 而每台slave上都只有一个slave_io和一个slave_sql.我说明白了吧 再不明白 我也么办法了
上述的输出信息显示slave_io_running为NO 就表明这个线程未启动
这三个线程是这样互动的:首先io被创建后 会连接到master上 并要求master发送二进制日志里的语句 这个二进制日志留到后面再长篇大论 master的主线程便会处理这个合理的要求 然后slave_io会读取master传递过来的语句并把它们复制到数据目录下的中继日志(relay logs)中 可见这个slave_io要做两件事 一件是发送请求(如果可以这样理解的话) 另一件是读取并保存数据 最后 slave_sql 出场了 它会读取中继日志(delay logs)中的语句并执行它们而达到更新数据的目的
现在来说说这个二进制日志,mysql有多种日志格式,二进制是其中一种,无论是win还是linux,二进制日志默认都是关闭的 要开启很简单 只要在my.cnf或者my.ini里写上log-bin=path,path就是日志存放路径