如果有多台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 |
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 |
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 |
18 | Replicate_Ignore_Table: |
19 | Replicate_Wild_Do_Table: |
20 | Replicate_Wild_Ignore_Table: |
24 | Exec_Master_Log_Pos: 98925 |
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) |
我们再到从服务器看一下:
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重复操作一次即可。