如果有多台mysql数据库服务器需要需要做数据同步,或者读写分离的时候。就需要做一个数据库的主从复制,操作起来也比较简单。
如下:
主服务器x.x.x.233
从服务器x.x.x.234
首先需要在主数据库配置一下my.cnf
开启binlog增加serverid
server-id = 1
log-bin = bin-log
重启服务后生效
登陆数据库
创建一个用户台tmpcopy,密码为mysq,并授权这个用户可以从x.x.x.234这个IP以replication的权限登陆
1 |
mysq> update mysql.user set user= 'tmpcopy' where password=password( "mysql" );
|
2 |
Query OK, 1 row affected (0.48 sec) |
3 |
Rows matched: 1 Changed: 1 Warnings: 0 |
5 |
mysq> flush privileges; |
6 |
Query OK, 0 rows affected (0.03 sec) |
8 |
mysq> grant replication slave on *.* to tmpcopy@x.x.x.234 identified by 'mysql' ;
|
9 |
Query OK, 0 rows affected (0.06 sec) |
锁住主服务器的数据写入(防止下面记录bonlog的位置后,产生新的数据)
1 |
mysql>flush tables with read lock;
|
然后查看一下主服务器的状态
1 |
mysq> show master status; |
2 |
+----------------+----------+--------------+------------------+ |
3 |
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | |
4 |
+----------------+----------+--------------+------------------+ |
5 |
| bin-log.000001 | 41582 | | | |
6 |
+----------------+----------+--------------+------------------+ |
当前的binlog文件是bin-log.000001,位置是41582
这时候需要手工做一次同步,让主服务器和从服务器数据保持一致。
复制datadir或者从主服务器mysqldump导出sql文件再导入从服务器,这里不再累赘。
同步后目前两台服务器数据是一致的
然后配置一下从服务器的my.cnf
增加server-id=2
然后重启服务,登陆
切换从服务器的master,并配置当前数据所处的binlog文件以及位置
1 |
mysq> change master to master_host= 'x.x.x.1' ,master_user= 'tmpcopy' ,master_password= 'mysql' ,master_log_file= 'bin-log.000001' ,master_log_pos=41582;
|
2 |
Query OK, 0 rows affected (0.01 sec) |
启动主从
2 |
Query OK, 0 rows affected (0.00 sec) |
查看一下从服务器的状态
01 |
mysq> show slave status\G |
02 |
*************************** 1. row *************************** |
03 |
Slave_IO_State: Waiting for master to send event
|
04 |
Master_Host: x.x.x.233 |
08 |
Master_Log_File: bin-log.000001 |
09 |
Read_Master_Log_Pos: 98925 |
10 |
Relay_Log_File: mysqld-relay-bin.000002 |
12 |
Relay_Master_Log_File: bin-log.000001 |
14 |
Slave_SQL_Running: Yes |
18 |
Replicate_Ignore_Table: |
19 |
Replicate_Wild_Do_Table: |
20 |
Replicate_Wild_Ignore_Table: |
24 |
Exec_Master_Log_Pos: 98925 |
25 |
Relay_Log_Space: 57751 |
29 |
Master_SSL_Allowed: No |
35 |
Seconds_Behind_Master: 0 |
36 |
Master_SSL_Verify_Server_Cert: No |
41 |
Replicate_Ignore_Server_Ids: |
43 |
1 row in set (0.01 sec)
|
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个状态运行了就已经配置完成了
测试一下:
创建数据库testdb
1 |
mysq> create database testdb; |
2 |
Query OK, 1 row affected (0.00 sec) |
选择数据库testdb并创建表test_tables以及两个字段id和test
3 |
mysq> create table test_table ( id int(3), test char (10));
|
4 |
Query OK, 0 rows affected (0.01 sec) |
插入数据
1 |
mysq> insert test_table values( '1' , 'test-data' );
|
2 |
Query OK, 1 row affected (0.01 sec) |
我们再到从服务器看一下:
02 |
+--------------------+ |
04 |
+--------------------+ |
08 |
+--------------------+ |
09 |
15 rows in set (0.08 sec)mysq> use testdb;
|
11 |
mysq> select * from test_table;
|
17 |
1 row in set (0.00 sec)
|
新创建的数据库,表,表内的数据都已经同步了。
主从复制完成
如果需要一主多从,从服务器的配置再到别的服务器上配置一个不通的server-id重复操作一次即可。