Mysql主從配置

Mysql主從配置mysql

  • Mysql主從介紹
  • 準備工做
  • 配置主
  • 配置從
  • 測試主從同步

Mysql主從介紹linux

Mysql主從又叫作Replication、AB複製。簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步的。
Mysql主從是基於binlog的,主上須開啓binlog才能進行主從。
主從過程大體有3個步驟sql

  1. 主將更改操做記錄到binlog裏
  2. 從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏
  3. 從根據relaylog裏面的sql語句按順序執行

主上有一個log dump線程,用來和從的i/o線程傳遞binglog
從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另一個sql線程用來把relaylog裏面的sql語句落地數據庫

Mysql主從配置

準備工做(兩臺機器上搭建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這樣就能夠保證同步了

相關文章
相關標籤/搜索