Mysql 主从复制安装指南
一,主从伺服器的实现
1,下载相应的软件包:mysql-5.5.34-linux2.6-x86_64.tar.gz进行安装
tar -xvf mysql-5.5.34-linux2.6-x86_64.tar.gz -C /usr/local cd /usr/local ln -sv mysql-5.5.34-linux2.6-x86_64 mysql ln mysql/bin/* /usr/bin/ cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld mysqld --verbose --help
以上步骤在所有的主从伺服器上执行完毕后mysql就安装完毕了。
2,修改主伺服器的my.cnf文件
server-id=1 thread_concurrency = 4 #根据伺服器的CPU数量来设置 innodb_file_per_table=1 #此项设置为是所有的表成为单个的文件 log-bin=mysql-bin.log binlog-ignore-db=mysql slave-skip-errors=all sync_binlog=1 auto_increment_increment=2 auto_increment_offset=1
然后启动mysql service mysqld start
mysql -u root -p mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO m66@'10.207.238.%' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES;
以上命令为建立主从之间复制所用的账户m66密码123456
3,修改从伺服器的my.cnf文件
thread_concurrency = 4 #根据伺服器的CPU数量来设置 server-id = 11 innodb_file_per_table=1 #此项设置为是所有的表成为单个的文件 #log_bin=mysql-bin relay-log=relay-bin relay-log-index=relay-bin-index #设置中继二进制日志
可以通过命令SHOW GLOBAL VARIABLES LIKE '%relay%';查看中继参数
mysql>flush tables with read lock;#鎖定數據庫為只讀模式 mysql>unlock tables;
4,在从伺服器上进入mysql后使用命令
mysql> CHANGE MASTER TO mysql> MASTER_HOST='172.16.1.1', mysql> MASTER_USER='hadoop', mysql> MASTER_PASSWORD='123456';
设置完后解锁数据库
mysql>unlock tables;
来设置从伺服器与主伺服器间的复制。
5,在从伺服器上使用命令
mysql> START SLAVE; #启动从伺服器 mysql> STOP SLAVE;#停止从伺服器 mysql> SHOW SLAVE STATUS\G #查看从伺服器的信息
6,对于有大量数据并且需要第一次大量同步是可以使用备份数据库再还原的形式来实现,具体的方法如下
a,停止主数据库的二进制日志 mysql> SET SQL_BIN_LOG=0; b,对当前主数据库进行相应的备份 mysqldump --all-database --lock-all-tables --master-data=2 > /mnt/slave.sql c,将备份的文件 scp /mnt/slave.sql root@mysql02:/tmp/slave.sql d,停止从伺服器mysql02的slave进程 mysql> STOP SLAVE; e,使用命令在sql模式下 mysql> SOURCE /tmp/slave.sql f,此时千万不能马上启动SLAVE进程 g,head -30 /tmp/slave.sql找到MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=609; h,再在从伺服器上用命令 mysql> CHANGE MASTER TO mysql> MASTER_HOST='172.16.1.1', mysql> MASTER_USER='hadoop', mysql> MASTER_PASSWORD='123456', mysql> MASTER_LOG_FILE='mysql-bin.000001', mysql> MASTER_LOG_POS=609; j,上面一切命令执行完成后在START SLAVE;
7,如何从服务器的mysql服务在启动时不要自动启动从服务线程
[mysqld] skip-slave-start=1
二,主从伺服器半同步实现
1,on master
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'smeisync_master.so'; mysql> SET GLOBAL rpl_semi_sync_master_enabled=1; mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000; 查看semi_sync是否开启命令 mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; on slave mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'smeisync_slave.so'; mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
2,以上关于semi_sync的启用也可以在my.cnf中指定
on master
[mysqld] rpl_semi_sync_master_enabled=1 #设置永久有效 rpl_semi_sync_master_timeout=1000 #此处单位为毫秒也就是一秒 on slave [mysqld] rpl_semi_sync_slave_enabled=1 #设置永久有效
3,当在SLAVE上设置完毕后需要从启SLAVE线程
mysql> STOP SLAVE; mysql> START SLAVE;
4,查看主伺服器上semi_sync是否开启
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 查看从伺服器上semi_sync是否开启 mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%'; 当主服务器上semi_sync中的clients变为1,证明只从版同步复制链接成功。
5,使用命令
mysql> SHOW PLUGINS; 即可查看加载的插件
6,查看semi_rync是否工作可以使用命令
mysql> SHOW STATUS LIKE 'rpl_%';
三,数据复制的过滤
1,binlog-do-db=hadoop #表示之复制hadoop数据库 binlog-ignore-db=hadoop #表示不复制hadoop,其他都复制 如果两个选项都存在binlog-do-db生效 2,如果 binlog-do-db=hadoop #如果此选项在主服务器上,就表示任何不涉及到hadoop数据库相关的写操作都不会记录到二进制中; 因此一般数据库的复制过滤在从服务器上进行。 3,从服务器过滤操作 replicate_do_db #相当于白名单 relicate_ignore_db #相当于黑名单 replicate_do_table replicate_ignore_table replicate_wild_do_table=hadoop.tb% replicate_wild_ignore_table=hadoop.tb1% 从服务器的复制只是将主服务器的所有二进制文件复制过来后,对不进行复制的数据库不执行相应的语句,所以同样会占用带宽。 当复制多个数据库时将一个选项使用多次即可 [mysqld] replicate_do_db=hadoop replicate_do_db=mysql
四,MySQL - 主从结构.添加新 Slave
复制主库要步骤:
====================
1.将内存中的数据同步到表中.
2.锁定表,不让出现脏数据
3.备份
4.解锁
5.在另一台机器上同步数据,并且设置 master_log_file 和 master-log_pos
命令:
a.同步数据,并锁表:
mysql> flush tables with read lock;
b.记住当前 binlog 的偏移值,后面设置 slave 上的值. show master status; 记下 file 和 position
c.备份:.参照 http://blog.sina.com.cn/s/blog_5f54f0be0100vp6m.html
命令:
mysqldump --all-databases --host=10.207.238.66 > backup.sql
d.解锁
mysql> unlock tables;
e.同步从机.将 backup.sql 复制到从机上
mysql --host=10.207.238.67 < backup.sql
设置从机:
mysql> change master to master_host = '10.207.238.66', master_port = 3306, master_user = 'm66', master_password='123456', master_log_file='master-bin.000005', master_log_pos=194244;
这里的 master_log_file 和 master_log_pos 就是前面第 2 步中记下来的两个值.
开启从机
start slave;
复制从库要步骤:
====================
可以看到,从主库复制会有段时间锁表,这段时间会影响主库的使用。如果我们能直接从从库进行复制,就不会对主库产生影响了。但是,从从库复制要保证的是复制过程中从库上的数据不会发生变化,所以要先停掉从库。
1.停止从库: mysql> stop slave;
2.看当前从库的状态。和前面的看主库状态一样。但现在是从从库复制,所以查看从库状态:mysql> show slave status;
记下 Relay_Master_Log_file 和 Exec_Master_Log_Pos, 用处和前面一样.
3.备份从库数据.用 mysqldump
4.在新的从库上还原数据
5.设置新从库的 slave 参数.
change master to master_host = '10.207.238.66', master_port = 3306, master_user = 'm66', master_password='root', master_log_file='master-bin.000005', master_log_pos=194244;
可以看到,虽然新从库是从从库复制的数据,但实际上 binlog 的 master 还是指向的主库。
另外,这里将 master_log_file 和 master_log_pos 设置成第 2 步中的 Relay_Master_Log_file 和 Exec_Master_Log_Pos
start slave;