Mysql主從配置mysql
Mysql主從介紹linux
Mysql主從又叫作Replication、AB複製。簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步的。
Mysql主從是基於binlog的,主上須開啓binlog才能進行主從。
主從過程大體有3個步驟sql
主上有一個log dump線程,用來和從的i/o線程傳遞binglog
從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另一個sql線程用來把relaylog裏面的sql語句落地數據庫
準備工做(兩臺機器上搭建mysql)
mysql安裝vim
master:192.168.221.10 mysql 關閉防火牆和selinuxsocket
slave: 192.168.221.20 mysql 關閉防火牆和selinuxide
配置主master測試
vim /etc/my.cnf //如下是配置文件內容 log_bin = apenglinux basedir = /usr/local/mysql datadir = /data/mysql port = 3306 server_id = 128 socket = /tmp/mysql.sock
查看由log_bin生成的相關的文件線程
ls -lt /data/mysql/|grep apenglinux //如下是文件內容 -rw-rw----. 1 mysql mysql 260 2月 25 02:33 apenglinux.index -rw-rw----. 1 mysql mysql 120 2月 25 02:33 apenglinux.000013 -rw-rw----. 1 mysql mysql 143 2月 25 01:34 apenglinux.000012 -rw-rw----. 1 mysql mysql 143 2月 25 01:32 apenglinux.000011 -rw-rw----. 1 mysql mysql 143 2月 25 01:13 apenglinux.000010 -rw-rw----. 1 mysql mysql 143 2月 24 22:27 apenglinux.000009 -rw-rw----. 1 mysql mysql 143 2月 24 22:23 apenglinux.000008 -rw-rw----. 1 mysql mysql 143 2月 24 22:16 apenglinux.000007 -rw-rw----. 1 mysql mysql 143 2月 24 22:14 apenglinux.000006 -rw-rw----. 1 mysql mysql 143 2月 24 22:12 apenglinux.000005 -rw-rw----. 1 mysql mysql 143 2月 24 22:11 apenglinux.000004 -rw-rw----. 1 mysql mysql 143 2月 24 22:08 apenglinux.000003 -rw-rw----. 1 mysql mysql 143 2月 24 22:08 apenglinux.000002 -rw-rw----. 1 mysql mysql 143 2月 24 22:07 apenglinux.000001
建立一個數據庫apeng並將mysql庫備份恢復到apeng庫上。rest
mysql -uroot -p -e "create database apeng;" mysqldump -uroot -p mysql > /tmp/mysql.sql mysql -uroot -p apeng < /tmp/mysql.sql
配置用做數據同步的用戶,鎖表,查看master的狀態
mysql -uroot -p mysql> grant replication slave on *.* to 'repl'@'192.168.221.20' identified by '123'; mysql> flush tables with read lock; mysql> show master status; //如下狀態信息 +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | apenglinux.000013 | 656513 | | | | +-------------------+----------+--------------+------------------+-------------------+
查看master上有哪些數據庫
mysql -uroot -p -e "show databases;" +--------------------+ | Database | +--------------------+ | information_schema | | apeng | | mysql | | performance_schema | | test | +--------------------+
爲了保證數據的一致性,還須要備份apeng數據庫,而後將備份傳到slave機器上。
mysqldump -uroot -p apeng > /tmp/apeng.sql
配置從slave
vim /etc/my.cnf //增長以下 server_id=130 /etc/init.d/mysqld restart
將master上的數據庫apeng的備份文件拷貝到slave上
scp 192.168.221.10:/tmp/apeng.sql /tmp/
建立數據庫apeng,恢復數據庫到apeng庫
mysql -uroot -p -e "create database apeng;" mysql -uroot -p apeng < /tmp/apeng.sql
mysql> stop slave; mysql> change master to master_host='192.168.221.10',master_port=3306,master_user='repl',master_password='123',master_log_file='apenglinux.000013',master_log_pos=656513; mysql> start slave;
mysql> show slave status\G
如下是查看到salve的信息,包含如下說明主從配置成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 Last_IO_Errno: 0 Last_SQL_Errno: 0
在master做以下設置
mysql> unlock tables;
測試主從同步
在master上建立數據庫along,在along上建立表students並插入數據,顯示結果以下 mysql> create database along; mysql> use along; mysql> create table students( id int(3) not null auto_increment primary key, name varchar(50) not null ); mysql> insert into students(name) -> values ('zhangsan'),('lisi'),('wangwu'),('zhaoliu'); mysql> select * from students; +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | | 4 | zhaoliu | +----+----------+
在slave上查看
mysql> select * from along.students; +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | | 3 | wangwu | | 4 | zhaoliu | +----+----------+
/etc/my.cnf配置文件中能夠這樣定義
master binglog-do-db= //僅同步指定的庫 binglog-ignore-db= //忽略指定庫 slave replication_do_db= replication_ignore_db= replication_do_table= replication_ignore_table= replication_wild_do_table= //如apeng.% replicatin_wild_ignore_table=
在slave上刪除了數據庫,立刻查從的狀態,從顯示ok。
在master刪除了一樣的數據庫,再次查slave的狀態會有以下提示
Last_SQL_Error: Error 'Can't drop database 'along'; database doesn't exist' on query. Default database: 'along'. Query: 'drop database along' //如下方法能夠解決(數據仍是同樣的狀況下)
在主上查看master的狀態。
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | apenglinux.000013 | 657627 | | | | +-------------------+----------+--------------+------------------+-------------------+
在slave上做以下配置
mysql> stop slave; mysql> change master to master_host='192.168.221.10',master_port=3306,master_user='repl',master_password='123',master_log_file='apenglinux.000013',master_log_pos=657627; mysql> start slave; mysql> show slave status\G //這時主從數據庫又恢復正常
對於如下這種錯誤,能夠這樣解決。
dba:(none)> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
在保證主從數據一致時,能夠mysql> reset slave;mysql> stop slave;mysql> change master to master_host='',..... 這裏就省略了mysql> start slave;mysql> show slave status\G這樣就能夠保證同步了