我是正常蛇

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

【主服务器】

在/etc/mysql/目录下找到my.cnf,添加如下代码     

[mysqld]
log-bin=binary-log
server-id=1

log-bin表示启动二进制日志,二进制日志记录了MYSQL语句流,通过传输流可以将所有语句复原在从服务器上,实现复制过程。

server-id 标志SQL语句流的来源。

 

在MYSQL中执行下面的语句

SHOW MASTER STATUS;

可以查看二进制文件及其位置,

现在需要在主服务器上为从服务器建一个USER,并赋予REPLICATION SLAVE权限

CREATE USER username@'192.168.%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAE ON *.* TO test@'192.168.%';

注意这里虽然指定了 user 的 host,但如果在my.cnf的bind-host选项为127.0.0.1的话,MySql依然不允许远程访问,这里将这个配置项改为0.0.0.0 

 

【从服务器配置】

依然先对my.cnf进行添加:

[mysqld]
server-id=2
read_only=TRUE

read_only让登录从服务器的用户只具备读权限,如果从服务器有写权限可能会造成SLAVE SQL 线程出错,后面会具体说从服务器的权限问题。

登录到从服务器的MYSQL,运行下面的语句来对主服务器的信息进行配置:

CHANGE MASTER TO
MASTER_HOST='your master ip address',
MASTER_USER='your username',
MASTER_PASSWORD='your password',
MASTER_LOG_FILE='binary-log.000009',
MASTER_LOG_POS=3011;

这里LOG_FILE和LOG_POS根据上面的SHOW MASTER STATUS;命令得到的数据来填写。

最后运行

SLAVE START;
SHOW SLAVE STATUS\G;

Slave_IO_Running  和 Slave_SQL_Running 都是YES的话,那么说明配置好了,如果出现错误可以根据LAST_IO_ERROR 和 LAST_SQL_ERROR 参数来进行排错。

现在在主服务器上的写操作在从服务器上都会被复原,那么就是通过binary-log的传输来实现的。

 

【错误排除】

最容易出现的错误是从服务器的管理员向从服务器中写入了数据而导致无法继续同步的错误,这也是从服务器必须以read-only运行的原因。

现在假设有下面这个场景:

管理员登录从服务器一个不小心在同步的表中增加了主键为22的行,而之后不久主服务器也增加了这一行,此时主服务器会将该命令记录在binary-log中并传输给从服务器,从服务器收到命令并执行,缺发现增加的是相同主键,就会出错,这时我们运行SHOW SLAVE STATUS\G会得到如下结果:

这里需要说说IO 和 SQL 线程, IO线程用于接受二进制流的传输,SQL用于执行传输来的命令,这里因为出错所以从服务器会停止 SQL 线程的运行,所以之后如果主服务器再有写操作,从服务器都不会进行复原,但是依然会接受二进制流,这样一个好处是只需要在从服务器上做手脚就能复原出错之前主服务器的一切操作,具体复原方法如下:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
SLAVE START SQL_THREAD;
SHOW SLAVE STATUS\G;

防止这种事情的发生就是始终以read-only去登录从服务器,注意用户如果具有super权限会忽略全局配置中的read-only选项,所以始终不要以super权限去运行从服务器。

posted on 2012-12-11 13:42  我是正常蛇  阅读(275)  评论(0编辑  收藏  举报