mysql主从复制:
首先修改master,slave中的配置文件,my.ini或my.conf,都加在[mysqld]域中;
master中的配置:
#replication option
server-id=1
log-bin=mysql-bin.log
slave中的配置:
#log-bin path slave option
server-id=2
log-bin="G:/MySQLbinlog/mysql-bin"
log-bin-index="G:/MySQLbinlog/mysql-bin.index"
log-slave-updates=1
relay-log="G:/MySQLbinlog/mysql-relay-bin"
relay-log-index="G:/MySQLbinlog/mysql-relay-bin.index"
max-binlog-size=200m
#这个是数据库启动的时候slave线程不自动启动,而是需要自己手动设置,给予自己一个修复的时间。如果在配置文件中把change master to的信息设死,则每次启动的时候可以
skip-slave-start=1
自动开启复制线程
read-only=1
slave-skip-errors=1062,1053
#replicate-do-db=rep_test_db 这些复制过滤条件有时候不起作用,请慎用
#replicate-do-table=rep_test_db.user
#replicate-wild-do-table=rep_testdb.%
#replicate_ignore_table
#replicate_wild_ignore_table
然后开始下面操作:
进入master住进锁表:flush tables with read lock;
然后在没有写的情况下到处数据库逻辑备份(全部的话就是--all-databases)
D:\MySQLDATA\data>mysqldump --master-data --single-transaction -uroot -ptsixi rep_test_db > d:/dbbackup.sql
将该备份中的change master部分注销。
在slave端导入使两边数据同步
mysql -uroot -plumi rep_test_db < G:\update\dbbackup2.sql
做change master命令将slave指向master
mysql> change master to
-> master_host='220.167.54.227',
-> master_user='repl',
-> master_password='tsixi',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=2179,
-> master_port=32230;
Query OK, 0 rows affected (0.20 sec)
启动复制进程
mysql> start slave(要停止这两个线程就用start stop)
Query OK, 0 rows affected (0.00 sec)
然后进入master解锁:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
slave端:
mysql> show processlist\G
*************************** 3. row ***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 122
State: Waiting for master to send event
Info: NULL
*************************** 4. row ***************************
Id: 5
User: system user
Host:
db: NULL
Command: Connect
Time: 117
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
4 rows in set (0.00 sec)
master端:
mysql> show processlist\G;
*************************** 5. row ***************************
Id: 25
User: repl
Host: 118.113.221.173:55464
db: NULL
Command: Binlog Dump
Time: 166
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 6. row ***************************
测试一切OK,如果想尝试双master搭建的话,在上面的基础上简单的修改就可以了~!
可以参考这个链接:http://www.linuxfly.org/post/592/1/2/
双master主要是为了一个写库的时候可以快速的采用一个从库来替代。当然不能两边同时写,因为复制是异步的,可能造成数据非一致性问题。
如果采用简单的HA方案,两个master。master1,master2。1挂了的话,自动切换到2,1好了又切换回1。
但始终感觉这个中间有问题。比如1挂的时候你切到了2,在2中执行update table1 set name="2" ,这句话执行完后,还没有复制到1中,这时候1好了
,又一句sql执行update table1 set name="1ok了",当这句话执行完后,master1的复制才过来,执行了update table1 set name="2" ,。这时候master2
的name就变成了"2"了。这样明显跟我们的期望是不相符的。
目前只想出来两种方法减少这种情况的发生:
1 - 就是切过去了,就不要再自动切回来了。。。目前有这种简单的HA现成解决方案么?试了amoeba和cobarClient,都给自动切回来了。。。。
2 - 切回来的时候,先锁住写库,确保复制全部完成之后,再切回来,放开锁。这种相当于停机了,不大可取。
3 - 尽量减少复制延迟。