十四周三次课、MySQL主从配置
2019獨角獸企業重金招聘Python工程師標準>>>
說明:有不少同學不能一次性把實驗做成功,這是因為還不熟悉,建議至少做3遍
注意:做實驗先關閉防火墻
17.1 MySQL主從介紹
? MySQL主從又叫做Replication、AB復制。簡單講就是A和B兩臺機器做主從后,在A上寫數據,另外一臺B也會跟著寫數據,兩者數據實時同步的
? MySQL主從是基于binlog的,主上須開啟binlog才能進行主從。
? 主從過程大致有3個步驟
? 1)主將更改操作記錄到binlog里
? 2)從將主的binlog事件(sql語句)同步到從本機上并記錄在relaylog里
? 3)從根據relaylog里面的sql語句按順序執行
? 主上有一個log dump線程,用來和從的I/O線程傳遞binlog
? 從上有兩個線程,其中I/O線程用來同步主的binlog并生成relaylog,另外一個SQL線程用來把relaylog里面的sql語句落地
主從同步 :
? ? ? 主服務器 :授權允許同步:
? ? ? ? ? ? ? (1)NS記錄;
? ? ? ? ? ? ?(2)授權允許區域傳送
? ? 從服務器 :?
? ? ? ? ? ? (1)只需定義區域
MySQL主從原理圖
?
?
17.2 準備工作
準備兩臺機器,都安裝mysql服務,機器01: IP:192.168。133.130作為主庫,機器02:IP:132作為從庫。
1、先切換到cd /usr/local/src/,wget下載MySQL,在兩臺機器上面,然后解壓。
2、把解壓完的目錄放到/usr/localmysql, ? ? 命令:mv mysql-5.6.35-linux-glibc2.5-x86_64 ? ?/usr/local/mysql,,,,先檢查有沒有這個/usr/local/mysql目錄。如果有,就改名字。。。移動完成后,
使用命令查看:ls /usr/local/mysql ?,發現目錄下面有:bin、data、include、man、lib。
?
3、先創建用戶,useradd=mysql, ??初始化:./scripts/mysql_install_db --user=mysql --datadir=/data/mysql ? ?,查看有沒有初始化完成,命令:echo $?
?
4、vi /etc/my.cnf, ?把datadir后面修改成datadir=/data/mysql
5、cp support-files/mysql.server /etc/init.d/mysqld? ? ? ? ?#把啟動腳本復制到/etc/init.d/mysqld
?
6、vim ? /etc/init.d/mysqld ? ?中定義basedir和datadir, ? ?, , ? ,命令:basedir=/usr/local/mysql和datadir=/data/mysql
7、啟動mysql服務,/etc/init.d/mysqld start
如果報錯,就cd /data/mysql 再使用命令ls,查看mysql目錄下的文件。查看錯誤日志,命令:tail +主機名.err, ? , ?
只有命令:less !$,翻頁查看
使用命令:ls -l /data/mysql,查看所屬組和所數者是不是root,沒有說明正常。如果是,說明有問題要修改過
修改方法:
在機器01上面操作
[root@ocalhost mysql]# chown -R mysql:mysql # 所屬組和所數者為mysql [root@localhost ] # /etc/init.d/mysqld start 啟動mysql服務 Staring MySQL.SUCCESS #啟動成功 [root@localhosts ~]# !ps #查看啟動的mysql服務在機器02查看啟動mysql
[root@ocalhost 02]# ls /usr/local/mysql # 所屬組和所數者為mysql bin data include man my-new.cnf README share support-files [root@localhosts 02~]# /etc/init.d/mysqld start #啟動mysql服務 [root@localhosts ~]# ps aux | grep mysql #有mysql字樣和端口信息,MySQL說明啟動了?
?
17.3 配置主
? 安裝mysql
? 修改my.cnf,增加server-id=130和log_bin=aminglinux1 ? ? ?#01終端的名字
? 修改完配置文件后,啟動或者重啟mysqld服務
? 把mysql庫備份并恢復成aming庫,作為測試數據
? mysqldump -uroot mysql > /tmp/mysql.sql
? mysql -uroot -e “create database aming”
? mysql -uroot aming < /tmp/mysql.sql
? 創建用作同步數據的用戶
? grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
? flush tables with read lock;
? show master status;
實例:
在機器01上面操作
第一步
修改配置文件
[root@ocalhost mysql]# vi /etc/my.cnf ? ? ?# aminglinux1 01終端的名字 [root@localhost mysql]# /etcinit.d/mysqld restart #重啟MySQL服務 [root@ocalhost mysql]# pwd #查看當前的目錄 /data/mysql [root@ocalhost mysql]# ls -lt #查看有沒有生成aminglinux文件 ...... 1 mysql mysql 238972323 .. ... ... .. aminglinux1.0001 ...... 1 mysql mysql 238972323 .. ... ... .. aming #數據庫的名字 ...... 1 mysql mysql 238972323 .. ... ... .. aminglinux.index #實現主從的文件 ...... 1 mysql mysql 238972323 .. ... ... .. blog #接下來需要的blog文件第二步
[root@ocalhost mysql]# mysqldump -uroot -p aminglinux blog > /tmp/blog.sql #備份blog文件 [root@localhost mysql]# du sh /tmp/blog.sql # 查看備份文件的大小 [root@ocalhost mysql]# mysql -uroot -p aminglinux -e "create database aming" #-e 創建一個新的庫 [root@localhost mysql]# mysql -uroot -p aminglinux aming < /tmp/blog.sql #恢復blog文件到原來的地方創建用作同步數據的用戶
[root@ocalhost mysql]# mysql -uroot -p aminglinux #進入aming數據庫里面 mysql> grant replication slave on *.* to 'repl'@192.168.133.132 identified by '123456'; #指定權限 replication slave 所有的庫、所有的表,用戶repl,針對來源的IP,也就是02機器上的IP鎖定表
mysql > flush tables with read lock; mysql > show master status; mysql > quit #退出來 [root@localhost mysql]# ls #查看所有的數據庫 mysql mysql2 zrlog [root@ocalhost mysql]# mysql -uroot -p aminglinux mysql2 < /tmp/my2.sql #把mysql2 移到my2.sql [root@localhost mysql]# mysql -uroot -p aminglinux zrlog < /tmp/zrlog.sql #把zrlog移到/tmp/zrlog.sql [root@localhost mysql]# ls /tmp/*sql #查看拷貝的文件 /tmp/zrlog.sql /tmp/my2.sql /tmp/blog.sql?
17.4 配置從
? 安裝mysql
? 查看my.cnf,配置server-id=132,要求和主不一樣
? 修改完配置文件后,啟動或者重啟mysqld服務
? 把主上aming庫同步到從上
? 可以先創建aming庫,然后把主上的/tmp/mysql.sql拷貝到從上,然后導入aming庫
? mysql -uroot
? stop slave;
? change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
? start slave;
? 還要到主上執行 unlock tables
實例:
在02機器上面操作
[root@localhost ~]# ps aux | grep mysql #查看mysql服務有沒有啟動 [root@ocalhost ~]# vi /etc/my.cnf [root@localhost ~]# /etcinit.d/mysqld restart #重啟MySQL服務 [root@localhost ~]# ls /data/mysql #查看/data/mysql下的文件 [root@localhost ~]# scp 192.168.133.130:/tmp/*.sql /tmp/ #從01機器拷貝一些數據庫 [root@ocalhost mysql]# mysql -uroot -bash:mysql:未找到命令 [root@localhost mysql]# alias 'mysql=/usr/local/mysql/bin/mysql' [root@ocalhost mysql]# alias 'mysqldump=/usr/local/mysql/bin/mysqldump' [root@localhost mysql]# mysql -u root mysql > create database aming; mysql > create database zrlog; #創建兩個庫 mysql > create database blog mysql > create database mysql2; mysql > quit #退出來 [root@localhost mysql]# mysql -uroot blog < /tmp/blog.sql # 恢復 [root@ocalhost mysql]# mysql -uroot zrlog < /tmp/zrlog.sql [root@localhost mysql]# mysql -uroot aming < /tmp/blog.sql [root@ocalhost mysql]# mysql -uroot aming < /tmp/blog.sql [root@localhost mysql]# mysql -uroot mysql2 < /tmp/my2.sql [root@ocalhost mysql]# ls /data/mysql在機器01上面操作
[root@localhost mysql]# ls /data/mysql #查看01和02上面的文件是否一樣實現主從
在02上面操作
[root@ocalhost mysql]# mysql -u root mysql > start slave; mysql > stop slave; mysql > change master to master_host='192.168.133.130', master_user='repl', master_password='123456', master_log_file='amingliunx1.000001', master_log_pos=474566; mysql > start slave; #保存修改查看主從同步是否正常
? 從上執行mysql -uroot
? show slave stauts\G
? 看是否有
? Slave_IO_Running: Yes
? Slave_SQL_Running: Yes
? 還需關注
? Seconds_Behind_Master: 0? //為主從延遲的時間
? Last_IO_Errno: 0
? Last_IO_Error:
? Last_SQL_Errno: 0
? Last_SQL_Error:
實例:
在02機器上面操作
mysql > show slave status\G #查看主從配置有沒有配置成功 如果有兩個yes,說明配置主從成功了;如果兩個有一個不YES,說明主從已經斷開了在01機器上面操作
[root@localhost mysql]# mysql -uroot -p aminglinux mysql > unlock tables; #做完主從之后,恢復 mysql > exit?
?
17.5 測試主從同步
幾個配置參數
? 主服務器上
? binlog-do-db=????? //僅同步指定的庫
? binlog-ignore-db= //忽略指定庫
? 從服務器上
? replicate_do_db=
? replicate_ignore_db=
? replicate_do_table= ? ? ? ? ? ? ? ? ? ? ? ? ? ?#
? replicate_ignore_table= ? ? ? ? ? ? ? ? ? ? ? ? ?#
? replicate_wild_do_table=?? //如aming.%, 支持通配符%
? replicate_wild_ignore_table=
?
? 主上 mysql -uroot aming?
? select count(*) from db;
? truncate table db;
? 到從上 mysql -uroot aming
? select count(*) from db;
? 主上繼續drop table db;
? 從上查看db表
實例:
主上 01上面
mysql > ?use aming;????? #登陸aming庫 mysql > show tables; #查看阿明數據庫 mysql > select count(*) wp_users; #查看行數?
mysql > mysql >在 02上面操作
mysql > use aming; mysql > select count(*) from wp_users;主上 01上面
mysql > truncate table wp_users #清空 mysql > select count(*) from wp_users; #查看數據庫里面的東西有沒有被清空, mysql > select * from wp_users; #如果上一步沒有清空,執行這一步在 02上面操作,清空數據庫
mysql > select count(*) from wp_users; #查看數據庫里面的東西有沒有被清空, mysql > select * from wp_users; #再檢測一次,是否被清空?
測試再主上面刪除一個表,再從上面查看,是否查找到
mysql > drop table wp_users; #刪除wp_users表 mysql >在02機器,從的上面查看
mysql > select * from wp_users; mysql > drop databas aming; #刪除aming庫 mysql > show slave status\G #測試主從配置有沒有出錯誤。然后再01上面散出阿明表,在02上面測試
mysql > mysql > drop databas aming; #刪除aming庫在02機器,從的上面查看
mysql > show slave status\G #測試主從配置有沒有出錯誤。?
常見問題:
主從庫正常運行的時候,能否刪除多余的bin-log日志,刪除后會不會對主從庫有意響,如何正確的刪除bin-log
答:正確做法是在my.cnf配置日志過期時間。 自動刪除。?
當然也可以在mysql里面去刪除http://www.jb51.net/article/117819.htm?
2、把從庫的數據全部恢復了,再去解鎖主庫的表;
?
如果是生產環境,我主庫備份的數據庫有10G多,我從庫還原完,再去解鎖主庫的表;
答:首先,做主從這種操作基本上是在架構搭建初期就做好了的,
-
擴展里面,咱們不是有提到過,不停庫做主從的文章。 還有就是,盡量選擇在凌晨,沒有啥用戶的時候做,金融類的,肯定要發通知的。
?
3、
我在配置好了之后出現了錯誤:
Slave_IO_Running:?connecting Slave_SQL_Running:?Yes仔細檢查后發現主mysql配置授權的時候密碼有問題。
重新授權后再次查看狀態就ok了!切記一定要注意配置的各項參數!
答:后來檢查到是沒有關閉firewalld,selinux.
?
?
有的同學,遇到主從不能正常同步,提示uuid相同的錯誤。這是因為克隆機器導致。
https://www.2cto.com/database/201412/364479.html
轉載于:https://my.oschina.net/u/3803405/blog/1824172
總結
以上是生活随笔為你收集整理的十四周三次课、MySQL主从配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis大乱探------哨兵(二)
- 下一篇: 阿德莱德大学