主从复制的核心就是把mysql数据库从A机器同时备份到B机器了,这样可以方便分布式的数据处理了,下面我们来看一个经典的mysql主从复制配置步骤.
IP规划:
mysql主:192.168.0.100
mysql从:192.168.0.200
my.cnf配置:主mysql中的[mysqld]项里除了要配置相关参数以外还要配置必要的三项,现将一个最简单的示例:
- [mysqld]
- user=mysql
- pid-file=/var/run/mysqld/mysqld.pid
- socket=/var/run/mysqld/mysqld.sock
- basedir=/usr
- datadir=/var/lib/mysql
- tmpdir=/tmp
- log-bin=master-bin
- log-bin-index=master-bin.index
- server-id=1
备机相应的配置如下:
- [mysqld]
- user=mysql
- pid-file=/var/run/mysqld/mysqld.pid
- socket=/var/run/mysqld/mysqld.sock
- basedir=/usr--phpfensi.com
- datadir=/var/lib/mysql
- tmpdir=/tmp
- server-id=2
- relay-log=slave-relay-bin
- relay-log-index=slave-relay-bin.index
注:relay项配置的是中继日志和中继索引文件,如果二进制日志文件和中继日志文件名不指定,则默认使用主机名,推荐进行自定义.
重启mysql使上面的配置生效,在主mysql上新建一个用于复制权限的用户:
mysql> grant replication slave on *.* to 'repl'@'%' identified by 'mysqls';
上面新建的为用户名repl,密码为mysqls的用户,当然出于安全考虑,可以修改句中的%号为指定主机.
Query OK, 0 rows affected (0.00 sec)
当出现上面的提示时,表示已新建用户成功.
- mysql>showmasterstatus;
- +-------------------+----------+--------------+------------------+
- |File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
- +-------------------+----------+--------------+------------------+
- |master-bin.000004|224|||
- +-------------------+----------+--------------+------------------+
- 1rowinset(0.00sec)--phpfensi.com
在备mysql上指定复制主机的相关信息,并指定要复制的二进制文件和log号.
- mysql>changemastertomaster_host='192.168.0.100',master_user='repl',master_password='mysqls',master_log_file='master-bin.000004',master_log_pos=224;
master_host这一项的值建议使用主机名,因为如果遇到IP地址变更的,主机名一般不会变更,所以还是生效的,但IP变了,这里还是用的IP,就会导致主机无法找到对应的主设备.
启用slave状态:
mysql> start slave;
使用show slave status查看是否配置成功:
mysql> show slave status;
结果太多,我这里就不再复制,但主机看下面的两处,如果看到值是yes,表示已经成功.
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
验证数据的同步:主mysql上进行建库,建表,并插入测试数据:
- mysql>createdatabaserepl;
- mysql>createtablemy(idint(3),namechar(10));
- mysql>insertintofirst_tbvalues(001,'test');
以上操作在主机上每操作一步,都可以在备机上看到也有相应的库、表、值的增加,干脆来个狠的,在主mysql上利用批处理,加入1000条数据:
- #!/bin/bash
- for((i=0;i<1000;i++))
- do
- m=`tr-dcA-Z-a-z</dev/urandom|head-c5`
- mysql-uroot-ptestrepl-e"insertintomyvalues($i,'"$m"')"
- done
在备机上,对应上面的主机的操作,都可以查看到相应的数据.
- mysql>showdatabases;
- mysql>userepl;
- mysql>showtables;
- mysql>select*frommy;
上面的操作都是在主机和备机都是在一个全新安装的环境下进行的测试,而在生产环境中要使用时,先要将双方要同步的数据库同容进行同步,而如果主数据还有应用在使用时,还要刷新数据库并销定数据库.
mysql>flush tables with read lock;
先利用mysqldump导出所有的数据,并导入到备机,完成后,再在主mysql上解锁.
mysql>unlock tables;
当然如果数据量很大的情况下,利用mysqldump处理是很慢的,这里建议使用复制物理文件进行数据同步.
同步操作和上面的相同,上面的mysql操作同步是对所有库的完全同步,也包括mysql、information_schema这两个库的数据,如果要指定同步的数据库和忽略的数据库还要用到四个参数:
- binlog-do-db=repl
- binlog_ignore_db=mysql
- binlog_ignore_db=information_schema
- replicate-do-db=repl
- replicate-wild-ignore-table=mysql
- replicate-wild-ignore-table=information_schema
当然上面的四个参数使用的时候是有讲究的,使用不当还是有风险的,回头再专门做一个总结吧.