# 數據庫主從同步配置
> 備注:
1、經測試,不同版本的數據也可以執行主從同步(筆者主數據庫:5.6;從數據庫:8.0)
2、主數據庫需要開啟外網訪問權限
3、主從服務器的配置文件中的:server-id 一定不能相同
## 1、master主服務器的配置
### 1.1、配置文件數據庫my.cnf的修改
~~~
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test
#備注:
#server-id 服務器唯一標識。
#log_bin 啟動MySQL二進制日志,即數據同步語句,從數據庫會一條一條的執行這些語句。
#binlog_do_db 指定記錄二進制日志的數據庫,即需要復制的數據庫名,如果復制多個數據庫,重復設置這個選項即可。
#binlog_ignore_db 指定不記錄二進制日志的數據庫,即不需要復制的數據庫名,如果有多個數據庫,重復設置這個選項即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db為互斥選項,一般只需要一個即可。
~~~
### 1.2、給主數據庫增加復制的權限
##### 如果權限里有 REPLICATION,無需理會,直接跳過此步即可。
首先登陸數據庫(超級管理權限)
~~~
mysql -uroot -p;
#輸入密碼并進入數據庫
~~~
查詢復制用戶的權限(repl為數據庫用戶名):
~~~
mysql> show grants for 'repl'@'%';
+----------------------------------------------+
| Grants for repl@% |
+----------------------------------------------+
| GRANT USAGE SLAVE ON *.* TO 'repl'@'%' |
+----------------------------------------------+
~~~
明顯權限不對,修改權限如下:
~~~
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by '自己用戶的密碼';
mysql> show grants for 'repl'@'%';
+----------------------------------------------+
| Grants for repl@% |
+----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' |
+----------------------------------------------+
~~~
當權限顯示為**REPLICATION**是方才正確。
### 1.3、最后重啟主mysql后
再次超管權限進入mysql,并執行代碼,查詢數據庫狀態:
~~~
mysql> show master status
+------------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------+------------------+-------------------+
| mysql-bin.000007 | 328 | test_amind | | |
+------------------+----------+----------------+------------------+-------------------+
1 row in set (0.01 sec)
~~~
上面代碼中:
上圖顯示的File 對應的 **mysql-bin.000007** 跟Position對應的 **328** 就是從服務器需要用到的,
## 2、slave從服務器的配置
### 2.1、配置文件my.cnf的修改
~~~
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
#需要同步的表
replicate-wild-do-table = table.cmf_user
replicate-wild-do-table = table.cmf_admin
#備注:
#server-id 服務器唯一標識,如果有多個從服務器,每個服務器的server-id不能重復,跟IP一樣是唯一標識,如果你沒設置server-id或者設置為0,則從服務器不會連接到主服務器。
#relay-log 啟動MySQL二進制日志,可以用來做數據備份和崩潰恢復,或主服務器掛掉了,將此從服務器作為其他從服務器的主服務器。
#replicate-do-db 指定同步的數據庫,如果復制多個數據庫,重復設置這個選項即可。若在master端不指定binlog-do-db,則在slave端可用replication-do-db來過濾。
#replicate-ignore-db 不需要同步的數據庫,如果有多個數據庫,重復設置這個選項即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db為互斥選項,一般只需要一個即可。
~~~
### 2.2、重啟mysql服務
~~~
[root@localhost mysql]# service mysql restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
~~~
### 2.3、連接master主服務器(數據庫root超管權限)
~~~
#進入mysql數據庫
[root@localhost mysql]# mysql -uroot -p
Enter password:
#連接master主服務器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#備注:
#master_host對應主服務器的IP地址。
#master_port對應主服務器的端口。
#master_log_file對應show master status顯示的File列:mysql-bin.000007。
#master_log_pos對應show master status顯示的Position列:328。
~~~
### 2.4啟動slave數據同步
~~~
#啟動slave數據同步
mysql> start slave;
#停止slave數據同步(若有需要)
mysql> stop slave;
~~~
### 2.5 查看slave信息
~~~
mysql> show slave status\G;
~~~

Slave_IO_Running和Slave_SQL_Running都為yes,則表示同步成功。
## 3、 解決錯誤
若在主從同步的過程中,出現其中一條語句同步失敗報錯了,則后面的語句也肯定不能同步成功了。例如,主庫有一條數據,而從庫并沒有這一條數據,然而,在主庫執行了刪除這一條數據的操作,那么從庫沒有這么一條數據就肯定刪除不了,從而報錯了。在此時的從數據庫的數據同步就失敗了,因此后面的同步語句就無法繼續執行。
這里提供的解決方法有兩種:
(1)在從數據庫中,使用SET全局sql_slave_skip_counter來跳過事件,跳過這一個錯誤,然后執行從下一個事件組開始。
~~~
#在從數據庫上操作
mysql > stop slave;
mysql > set global sql_slave_skip_counter=1;
mysql > start slave;
~~~
(2)在從數據庫中,重新連上主數據庫。這種操作會直接跳過中間的那些同步語句,可能會導致一些數據未同步過去的問題,但這種操作也是最后的絕招。最好就是令從數據庫與主數據庫的數據結構和數據都一致了之后,再來恢復主從同步的操作。
~~~
#在從數據庫上操作
mysql > stop slave;
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2050;
mysql > start slave;
#備注
#master_log_file和master_log_pos可能會不同,需要在主數據庫中show master status來查看
~~~
- thinkphp
- thinkphp筆記
- 后臺登陸退出
- config配置
- 隱藏后臺模塊
- 單獨調用騰訊云行為驗證碼
- api接口跨域問題
- api接口創建案例代碼
- 使用gateway worker
- 使用swoole代碼筆記
- 使用隊列 think-queue筆記
- 后臺布局
- MySQL
- 1、關于lnmp mysql的一個坑
- 2、mysql實現group by后取各分組的最新一條
- 其他
- 搞笑的注釋代碼
- 分頁類
- nodejs 打包網址為exe
- 免費天氣預報API接口
- Ajax
- 簡單的ajax分頁1
- 通用ajax-post提交
- 引用的類庫文件
- Auth.php
- Auth.php權限控制對應的數據庫表結構
- Layui.php
- Pinyin.php
- Random.php
- Tree.php
- Tree2.php
- Js-Jq
- Git的使用
- 3、bootstrap-datetimepicker實現兩個時間范圍輸入
- CentOS安裝SSR做梯子
- Python爬蟲
- 1、安裝Gerapy
- 2、安裝Scrapy
- 3、Scrapy使用
- 4、Scrapy框架,爬取網站返回json數據(spider源碼)
- 0、Python pip更換國內源(一句命令換源)
- 服務器運維
- 1、寶塔使用webhook更新服務器代碼
- 2、搭建內網穿透
- 3、數據庫主從同步
- 4、數據庫復制
- hui-Shop問題
- 1、前端模板的注意事項
- 2、模板標簽