1.實驗環境,數據庫的安裝https://www.cnblogs.com/luohanguo/p/9045391.html
我的數據庫是分開裝的,先拷貝了虛擬機在裝的數據庫,若果是數據庫裝好后拷貝好像uuid是一樣的,所以會有點問題,不過網上有方法我看見了。
角色 | IP | OS/MySQL版本 | 有無應用數據 |
主數據庫 | 192.168.129.128 | CentOS7/5.7 | 無 |
從數據庫 | 192.168.129.129 | CentOS7/5.7 | 無 |
2.主從復制的原理
從庫生成兩個線程,一個I/O線程,一個SQL線程;i/o線程去請求主庫 的binlog,並將得到的binlog日志寫到relay log(中繼日志) 文件中;主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;SQL 線程,會讀取relay log文件中的日志,並解析成具體操作,來實現主從的操作一致,而最終數據一致;
--來自https://blog.csdn.net/php_younger/article/details/59673879
3.用途
1)災備
2)讀寫分離
3)數據備份
4.差不多MySQL也裝好了,開始配置環境
首先vim /etc/my.cnf,在里面添加(參數都很容易讀懂(:就不解釋了
log_bin=master-bin
server-id=10086 #不要和別的沖突
expire-logs-days=7
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
重啟mysql服務,service mysqld restart,進入mysql然后show master status; 這兩個值下面要用
為你的從數據庫添加用戶,密碼有要求,不會就Google Orz
GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.129.%' identified by ‘password’;
這時你可以去從數據庫那台虛擬機,然后輸入下面去嘗試連接主數據庫,如果連不了可能是Firewall
mysql -h 主庫的ip -P 端口 -u repl -p
試試下面的和3306做朋友
# 看看你的mysql端口開了沒
firewall-cmd --list-all
# 沒有就
firewall-cmd --permanent --add-port=3306/tcp
# 重啟
service firewalld restart
# 應該是有了
firewall-cmd --query-port=3306/tcp
在連接下遠程數據庫,不出意外是可以的!
在從數據庫那機子上的/etc/my.cnf里輸入
server-id = 10087
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
重啟服務,然后進入MySQL,然后
# 執行同步SQL語句
change master to
master_host='192.168.129.128',
master_port=3306,
master_user='repl',
master_password='密碼',
master_log_file='master-bin.000001',
master_log_pos=上面那個position;
再start slave; 你可以在輸入show slave status \G查看狀態,如果這兩個是true就意味着同步了
試試啊,去主庫闖將數據庫,表,添加屬性,刪除什么的,再去邊上瞅瞅,同步了就是ok了
5.上面已經弄好了,數據庫也同步了,那主從復制有什么用呢?
簡單來說,主從復制適合與讀多寫少的場景,比如這樣一個簡單的架構相對於單庫可用性,性能,容災都有提升(這就是鈔能力吧):
6.主從數據庫可能會發生不一致的問題,那怎么解決呢?
發生不一致的場景:https://www.2cto.com/database/201702/593470.html
簡單的解決方法:https://www.cnblogs.com/lixiansen/p/5667340.html
解決方法,划重點,常備份
6.1 鎖庫,flush table with read lock;
6.2 用mysqldump -h 主機名 -P 端口 -u 用戶 -p --databases 數據庫名 > XXX.sql來備份一個sql文件
6.3 scp文件名 root@從庫ip:/存儲路徑 再輸入你那個root用戶的密碼
6.4 查看主庫master的狀態file,position
6.5 stop slave; set sql_log_bin=0;
6.6 source你傳過來的sql文件
6.7 set sql_log_bin=1; flush privileges;
6.8 重啟下service,不知道有沒有用
6.9 設置從庫同步,就是那個change master to 再來一遍,記得和6.4的master狀態一樣
6.10 start slave;
6.11 show slave status \G;
兩個都是yes就好了,又同步了!