本文環境
主庫:centos6.5 x64 192.168.0.65 mysql-5.6.29
備庫:centos6.5 x64 192.168.0.66 mysql-5.6.29
一、正常配置方式一
# vi /etc/my.cnf
[mysqld]
log-bin = master-bin
log-bin-index = master-bin.index
binlog_format = mixed
server-id = 1
# service mysqld restart
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| file | position | binlog_do_db | binlog_ignore_db | executed_gtid_set |
| master-bin.000001 | 353 | | | |
1 row in set (0.00 sec)
mysql>
grant replication slave on *.* to 'repl'@'%' identified by '123456';
flush privileges;
說明: 預設隻要server-id不相同即可。
log-bin = mysql-bin
server-id = 11
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
配置說明: 不同步mysql庫可以實作主從庫有不同的帳号權限,經過測試,mysql5.6.29中隻在從庫中配置有效。
其它參數:
binlog-do-db = mydb 僅同步一個資料庫
#replicate-ignore-db = mysql 忽略掉mysql庫,該參數産生很多意外的同步問題,還是不使用。
replicate_wild_ignore_table = mysql.% 忽略掉mysql庫
create database `mydb`;
create table `user` (
`id` varchar(20) not null,
`username` varchar(20) not null,
`password` char(32) not null,
primary key (`id`)
) ;
insert into user values ('1', 'koumm', '123456');
insert into user values ('2', 'zhangsan', '123456');
insert into user values ('3', 'lisi', '123456');
insert into user values ('4', 'li2si', '123456');
insert into user values ('5', 'abc', '123456');
insert into user values ('6', 'tom', '123456');
insert into user values ('7', 'jk', '123456');
insert into user values ('8', 'xb', '123456');
mysql> flush tables with read lock;
query ok, 0 rows affected (0.00 sec)
1 row in set (0.00 sec)
mysql> show master logs;
+-------------------+-----------+
| log_name | file_size |
| master-bin.000001 | 353 |
[root@master ~]# mysqldump -uroot -p -b mydb > mydb.sql
說明:-b參數有建庫語句。
mysql> unlock tables;
query ok, 0 rows affected (0.00 sec)
# mysql -uroot -padmin < mydb.sql
mysql >
change master to
master_host='192.168.0.65',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='master-bin.000001',
master_log_pos=353;
mysql> start slave;
query ok, 0 rows affected (0.01 sec)
mysql> show slave status\g;
*************************** 1. row ***************************
slave_io_state: waiting for master to send event
master_host: 192.168.0.65
master_user: repl
master_port: 3306
connect_retry: 60
master_log_file: master-bin.000001
read_master_log_pos: 353
relay_log_file: slave-relay-bin.000002
relay_log_pos: 284
relay_master_log_file: master-bin.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: 353
relay_log_space: 457
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
master_uuid: c8bb22a1-024e-11e6-a1e8-000c29225fa0
master_info_file: /usr/local/mysql/data/master.info
sql_delay: 0
sql_remaining_delay: null
slave_sql_running_state: slave has read all relay log; waiting for the slave i/o thread to update it
master_retry_count: 86400
master_bind:
last_io_error_timestamp:
last_sql_error_timestamp:
master_ssl_crl:
master_ssl_crlpath:
retrieved_gtid_set:
executed_gtid_set:
auto_position: 0
error:
no query specified
#檢視如下兩個參數為yes,說明從庫運作正常。
slave_sql_running: yes
# 主庫插入一條記錄
mysql> use mydb;
database changed
mysql> select * from stu;
+----+----------+----------+
| id | username | password |
| 1 | koumm | 123456 |
| 2 | zhangsan | 123456 |
| 3 | lisi | 123456 |
| 4 | wangwu | 123456 |
| 5 | zhaoliu | 123456 |
| 6 | zhouqi | 123456 |
6 rows in set (0.00 sec)
mysql>
mysql> insert into stu values ('7', 'tom', '123456');
query ok, 1 row affected (0.05 sec)
mysql> commit;
| 7 | tom | 123456 |
7 rows in set (0.00 sec)
本文隻是配置mysql主從的一個過程。還是有很多需要考慮與改進的位址。
(1) 主從庫同步使用者權限的問題考慮,是直接從主庫同步權限呢,還是單獨考慮從庫的權限。
(2) mysql5.5有半自動主從同步複制
(3) mysql5.6有基于gtid主從複制
二、快速配置從庫方式二
1,主庫備份(全庫備份)
mysqldump -uroot -p -a -b --events --master-data=1 > mydb.sql
全庫備份記錄了資料庫備份時的master-bin.000003', master_log_pos=583位置,在配置從庫時無需要在主庫鎖表,記錄pos位置,解鎖等配置。
[root@localhost ~]# egrep -v "#|\*|--|^$" mydb.sql |head
change master to master_log_file='master-bin.000003', master_log_pos=583;
use `mydb`;
drop table if exists `user`;
create table `user` (
`id` varchar(20) not null,
`username` varchar(20) not null,
`password` char(32) not null,
primary key (`id`)
) engine=innodb default charset=utf8;
lock tables `user` write;
2,從庫建立同步的資料庫, 并導入資料
mysql -uroot -padmin
create database mydb;
mysql -uroot -padmin mydb < mydb.sql
3,配置主從同步
mysql>
change master to
master_host='192.168.0.65',
master_port=3306,
master_user='repl',
master_password='123456';
mysql> start slave;
query ok, 0 rows affected (0.02 sec)
mysql> show slave status \g;
*************************** 1. row ***************************
slave_io_state: waiting for master to send event
master_host: 192.168.0.65
master_user: repl
master_port: 3306
connect_retry: 60
master_log_file: master-bin.000003
read_master_log_pos: 583
relay_log_file: testdb-relay-bin.000004
relay_log_pos: 747
relay_master_log_file: master-bin.000003
slave_io_running: yes
replicate_do_db:
replicate_ignore_db:
replicate_do_table:
replicate_ignore_table:
replicate_wild_do_table:
replicate_wild_ignore_table: mysql.%
last_errno: 0
last_error:
skip_counter: 0
exec_master_log_pos: 583
relay_log_space: 2536
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
master_uuid: c8bb22a1-024e-11e6-a1e8-000c29225fa0
master_info_file: /usr/local/mysql-5.6.29-linux-glibc2.5-x86_64/data/master.info
sql_delay: 0
sql_remaining_delay: null
slave_sql_running_state: slave has read all relay log; waiting for the slave i/o thread to update it
master_retry_count: 86400
master_bind:
last_io_error_timestamp:
last_sql_error_timestamp:
master_ssl_crl:
master_ssl_crlpath:
retrieved_gtid_set:
executed_gtid_set:
auto_position: 0
三、主從同步簡單管理
1. 停止mysql同步
stop slave io_thread; #停止io程序
stop slave sql_thread; #停止sql程序
stop slave; #停止io和sql程序
2. 啟動mysql同步
start slave io_thread; #啟動io程序
start slave sql_thread; #啟動sql程序
start slave; #啟動io和sql程序
3. 重置mysql同步
reset slave;
清除主從同步參數,它會删除master.info和relay-log.info檔案,以及所有的中繼日志,并啟動一個新的中繼日志。
适用重新再次配置一次從庫的情況。
4. 檢視mysql同步狀态
show slave status;
5. 臨時跳過mysql同步錯誤
確定資料一緻的情況下臨時的跳過這個錯誤操作如下,有可能要多次。
stop slave;
set global sql_slave_skip_counter=1;
start slave;
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯誤
#slave-skip-errors=all #跳過所有錯誤
這裡出現一次1146報錯,是因為配置binlog-do-db過濾,出現該配置的bug問題,所有要慎用binlog-do-db。