最近做了研究了一下mysql数据库的replication,做一下小结!
4台服务器,操作系统都是是CentOS 5.5
Host1:192.168.2.81
Host2:192.168.2.82
Host3:192.168.2.83
Host4:192.168.2.84
目的:Host1做master,Host2-4做slave,同步复制Host1的Mysql数据库。
1)在Host1-4上面都安装好mysql,帐号root,密码123456
2)先配置Host1-4的mysql配置文件
Host1:vi /etc/my.cnf
在[mysqld]下面添加如下几行:
server-id = 1 #标识mysql中的id号,这里用1标识master,后面的Host2-4分别用2,3,4 来标识
#各台主机的id号不能一样,而且数字越小,表示的级别越高
log-bin #开启log日志记录,必须的,这样slave才能通过读取log来知道master的操作
expire_logs_days = 5 #保留多少天前的日志
binlog-ignore-db = mysql #忽略掉mysql这个 数据库的同步,其他的数据库都会同步
#binlog-do-db = sales #同步sales这个数据库,相应的slave服务器的mysql配置文件里面也要设置
Host2-4:vi /etc/my.cnf
在[mysqld]下面添加如下几行:
server-id = 2 #Host2是2,Host3是3,Host4是4
read-only = 1 #只读,防止除了replication之外的进程来对数据库做修改
replication-ignore-db =mysql #忽略同步的数据库
3)将Host1mysql重启/etc/init.d/mysqld restart,然后在Host1的mysql数据库里面给82,83,84授权
mysql -u root -p 123456
mysql> grant file,select, replication slave on *.* rep@'192.168.2.82' identified by 'rep';
mysql> grant file,select, replication slave on *.* rep@'192.168.2.83' identified by 'rep';
mysql> grant file,select, replication slave on *.* rep@'192.168.2.84' identified by 'rep';
4)授权之后锁表,以便备份数据库文件到slave服务器进行初始化
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
显示master数据库的状态,记下当前二进制日志文件名和position
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000002 | 228 | | |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
5)将Host1的/var/lib/mysql/目录下的数据库打包拷贝到Host2,Host3,Host4的目录下面,注意,如果Host2,Host3,Host4的/var/lib/mysql/目录下面有master.info和relay-log.info之类的文件,请先删掉他们!最好是将/var/lib/mysql/目录下的除mysql数据库的其它文件夹都给删掉,将拷贝过来的数据库解压的这个目录下面。
6)启动Host2,Host3,Host4的mysql数据库
/etc/init.d/mysqld start
mysql -uroot -p123456
执行如下命令:
mysql> change master to
-> master_host='192.168.2.81',
-> master_user='rep',
-> master_password='rep',
-> master_log_file='mysqld-bin.000002',
-> master_log_pos=228;
Query OK, 0 rows affected (0.01 sec)
注意到这里master_log_file和master_log_pos就是前面4)里面show master status的结果。
启动复制进程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
7)将master的数据库解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
8)创建测试table,插入数据
mysql> use test
Database changed
mysql> create table testrep(i int);
Query OK, 0 rows affected (0.05 sec)
mysql> insert into testrep values(1);
Query OK, 1 row affected (0.00 sec)
到Host2-4的数据库中查询
mysql> select * from testrep;
+——+
| i |
+——+
| 1 |
+——+
1 row in set (0.00 sec)
这样数据就已经从master复制到slave了。
在从库的数据库目录下面,有几个和复制相关的文件:
mysqld-relay-bin.* 从master数据库同步过来的binlog文件,也叫中继日志;
master.info master数据库帐号信息和同步信息,这里记录了复制用户名和密码
relay-log.info 跟踪执行同步过来的binlog的执行情况
在网上收mysql的replication的时候,看到很多人都在slave的my.cnf配置文件里面添加了同步的master数据库的信息
master_host='192.168.1.95',
master_user='rep',
master_password='rep',
需要说明一下,当/var/lib/mysql/目录下面没有master.info这个文件的时候,mysql启动的时候才会从my.cnf文件里面读取这些信
息,而在有master.info的时候,mysql直接从master.info里面读取master数据库的信息。所以个人还是喜欢不把那些信息写在配置
文件里面,而是在slave上第一次做replication的时候执行change master to 。