环境准备
至少2台linux的web服务器,Lamp环境以搭建完毕,本例以centos5.5测试。Mysq-master的ip地址为192.168.10.1,Mysql-slave的ip地址为192.168.10.2。
ifconfig eth0 192.168.10.1 --Master ifconfig eth0 192.168.10.2 --Slave
在主服务器中授权一个用户user1可以从从服务器192.168.10.2上登录到主服务器。
grant all on *.* to user1@'192.168.10.2' identified by 'user1';
查看用户授权表
select host,user,password from mysql.user
此时在从服务器中,可以通过以下命令登入主服务器
mysql -h192.168.10.1 -uuser1 -puser1
Mysql bin-log日志
--开启Mysql bin-log日志 # vi /etc/my.cnf port=3306 socket=/var/lib/mysql/mysql.sock log-slow-queries=mysql-slow.log --慢查询日志 log-error=mysql.err --错误日志 log=mysql.log --一般日志 log-bin=mysql-bin --二进制日志
与bin-log有关的日志刷新
--多一个最新的bin-log日志 mysql > flush logs; --查看最后一个bin日志 mysql > show master status; --清空所有的bin-log日志 mysql > reset master;
查看binlog日志
# mysqlbinlog mysql-bin-000001.bin --用mysqlbinlog mysql-bin-000001.bin时报错,说是字符集有问题 # mysqlbinlog --no-defaults mysql-bin-000001.bin
Mysql备份和bin-log日志
备份数据
--F即flush logs,可以重新生成新的日志文件,当然包括log-bin日志 --l读锁,所有人不能执行写的操作,保证备份数据的完整性 mysqldump -uroot -proot test -l -F > '/tmp/test.sql'
数据恢复
--恢复备份的sql数据 -- -v查看导入的详细信息 -f当中间遇到错误时,可以skip过去,继续执行下面的语句 mysql -uroot -proot test -v -f <'/tmp/test.sql' --然后从bin-log中恢复上次备份sql之后到数据库崩溃的时候 mysqlbinlog --no-defaults mysql-bin.000002 |mysql -uroot -proot test
根据pos点来进行恢复,以下是mysqlbinlog后跟的主要参数:
--stop-position="100"
![](/qrcode.jpg)
--start-position="50"
--stop-date="2012-01-04 21:17:50"
--start-date="2012-01-04 19:18:20"
mysqlbinlog --no-defaults mysql-bin.000001 --stop-position="288" |mysql -uroot -proot test
Mysql主从复制优点
1.如果主服务器出现问题,可以快速切换到从服务器提供的服务
2.可以在从服务器上执行查询操作,降低主服务器的访问压力
3.可以在从服务器上执行备份,以避免备份期间影响主服务器的服务
注意一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询,实时性要求高的数据仍然需要从主服务器获得
1)主服务器配置
--1登录mysql数据库 mysql -uroot -proot --2给从服务器设置授权用户 grant all on *.* to user1@'192.168.10.2' identified by 'user1'; --3修改主数据服务器的配置文件my.cnf,开启binlog,并设置server-id的值 log-bin=msyql-bin server-id=1 --清除binlog日志 mysql > reset master; --备份当前的数据 mysqldump -uroot -proot test -l -F >'/tmp/test.sql' --复制刚才备份的数据到从服务器上去 scp /tmp/test.sql 192.168.10.2:/tmp/
2)从服务器配置
--清空从服务器的binlog日志,以免发生混淆 reset master; --确保刚才从主服务器备份的sql到当前服务器时,库中没有表,保证数据完整性 --恢复数据 mysql -uroot -proot <'/tmp/test.sql'
log-bin=mysql-bin server-id=2 master-host=192.168.10.1 master-user=user1 master-password=user1 master-port=3306
重启mysql,从服务器mysql中执行show slave status\G,查看到如下信息:
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
说明已经可以进行同步了。
注意:如果之前从服务器中进行过命令行的从服务器配置,需要清除之前的配置信息
slave stop; slave reset;
然后重启下Mysql,就会加载到正确的mysql从服务器配置。
Mysql常见错误
从数据库无法同步:
Show slave status显示Slave_SQL_Running为No,Seconds_Behind_Master为null
原因:
a.程序可能在slave上进行了写操作
b.也可能是slave机器重启后,事务回滚造成的
解决:方法一
slave stop; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; slave start;
解决:方法二
Slave库,MySQL> slave stop; --停掉slave服务
Master库,MySQL> show master status;得到主服务器上当前的二进制日志名和偏移量
然后到slave服务器上执行手动同步
change master to master_host="192.168.10.1", master_user="user1", master_password="password", master_port=3306, master_log_file="mysql-bin.000003", master_log_pos=98; --启动slave服务, slave start --通过show slave status查看Slave_SQL_Running为Yes,Seconds_Behind_Master为0即为正常