运维服务小笔记

If not now,when?If not me,who?

十二月 10th, 2013

mysql数据库数据同步/主从复制的配置方法

326 views, Server, by 川望.

如果有多台mysql数据库服务器需要需要做数据同步,或者读写分离的时候。就需要做一个数据库的主从复制,操作起来也比较简单。
如下:
主服务器x.x.x.233
从服务器x.x.x.234

首先需要在主数据库配置一下my.cnf
开启binlog增加serverid
server-id                       = 1
log-bin                        = bin-log

重启服务后生效

登陆数据库

#mysql -uroot -p

创建一个用户台tmpcopy,密码为mysq,并授权这个用户可以从x.x.x.234这个IP以replication的权限登陆

mysq> update mysql.user set user='tmpcopy' where password=password("mysql");
Query OK, 1 row affected (0.48 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysq> flush privileges;
Query OK, 0 rows affected (0.03 sec)

mysq> grant replication slave on *.* to tmpcopy@x.x.x.234 identified by 'mysql';
Query OK, 0 rows affected (0.06 sec)

锁住主服务器的数据写入(防止下面记录bonlog的位置后,产生新的数据)

mysql>flush tables with read lock;

然后查看一下主服务器的状态

mysq> show master status;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| bin-log.000001 |    41582 |              |                  |
+----------------+----------+--------------+------------------+

当前的binlog文件是bin-log.000001,位置是41582

这时候需要手工做一次同步,让主服务器和从服务器数据保持一致。
复制datadir或者从主服务器mysqldump导出sql文件再导入从服务器,这里不再累赘。

同步后目前两台服务器数据是一致的
然后配置一下从服务器的my.cnf
增加server-id=2
然后重启服务,登陆
切换从服务器的master,并配置当前数据所处的binlog文件以及位置

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;
Query OK, 0 rows affected (0.01 sec)

启动主从

mysq> start slave;
Query OK, 0 rows affected (0.00 sec)

查看一下从服务器的状态

mysq> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: x.x.x.233
Master_User: tmpcopy
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin-log.000001
Read_Master_Log_Pos: 98925
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 57594
Relay_Master_Log_File: bin-log.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98925
Relay_Log_Space: 57751
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.01 sec)

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个状态运行了就已经配置完成了

测试一下:
创建数据库testdb

mysq> create database testdb;
Query OK, 1 row affected (0.00 sec)

选择数据库testdb并创建表test_tables以及两个字段id和test

mysq> use testdb;
Database changed
mysq> create table test_table (id int(3),test char (10));
Query OK, 0 rows affected (0.01 sec)

插入数据

mysq> insert test_table values('1','test-data');
Query OK, 1 row affected (0.01 sec)

我们再到从服务器看一下:

mysq> show databases;
+--------------------+
| Database           |
+--------------------+
| test               |
| testdb             |
| txt                |
+--------------------+
15 rows in set (0.08 sec)mysq> use testdb;
Database changed
mysq> select * from test_table;
+------+-----------+
| id   | test      |
+------+-----------+
|    1 | test-data |
+------+-----------+
1 row in set (0.00 sec)

mysq>

新创建的数据库,表,表内的数据都已经同步了。
主从复制完成

如果需要一主多从,从服务器的配置再到别的服务器上配置一个不通的server-id重复操作一次即可。



Back Top

发表评论

电子邮件地址不会被公开。 必填项已用*标注

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量