MySQL主從介紹、配置主從、測試主從同步


6月28日任務

說明:有不少同學不能一次性把實驗做成功,這是因為還不熟悉,建議至少做3遍
17.1 MySQL主從介紹
17.2 准備工作
17.3 配置主
17.4 配置從
17.5 測試主從同步
有的同學,遇到主從不能正常同步,提示uuid相同的錯誤。這是因為克隆機器導致。
https://www.2cto.com/database/201412/364479.html

 

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語句落地。

 

MySQL主從原理圖

 

 

使用場景:

第一種、作為單獨數據的備份,因為數據很重要,在主上寫一份數據,需要單獨在存一份數據,只是針對一台主進行讀寫操作,而從備份的數據就單純來備份備用着,假如主的主機出現硬件損壞突然宕機,隨時可以把從機器啟動起來,給客戶端提供服務。

第二種、同樣也是作為備份,但不僅是備份,web客戶端還要在從上面讀數據,正常情況下要寫到主上,讀也是在主上面讀,如果主的壓力比較大,現在就想在從上面做一個讀,那么web服務器就可以在從上面讀數據,但是不可以寫。(用作存庫作為讀,減輕主的壓力) 

 

17.2 准備工作

把limingsong-001作為主機器,limingsong-002作為從機器,同時把mysql進程啟動起來。

啟動主上的mysql進程

啟動從上的mysql進程

100703  9:28:54 [ERROR] Plugin 'InnoDB' init function returned error. 100703  9:28:54 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 查看錯誤日志發現問題,刪除mysql目錄下的ib_logfile0和ib_logfile1兩個文件,就可以解決問題了。

 

17.3 配置主

安裝並啟動好mysql后,修改my.cnf,增加server-id=128和log_bin=jimmy1

修改完配置文件后需要重啟mysqld服務

可以查看到在mysql目錄下多了2個文件,這2個文件甚至是更多的文件非常重要,是實現主從的根本,如果沒這2個文件的話,主從也沒辦法完成。

備份mysql庫並恢復成limingsong數據庫作為測試使用

創建用作同步數據的用戶

備份mysql2和test數據庫,等會需要把tmp下面所有的sql文件拷貝到從上去。

 

17.4 配置從

編輯my.cnf配置文件,增加server-id=129,要求和主不一樣。 

[root@jimmylinux-002 mysql]# vim /etc/my.cnf 增加 server-id=129

重啟mysql服務

把主上的sql文件拷貝過來並做一個恢復

[root@jimmylinux-002 mysql]# msyql -uroot -bash: msyql: 未找到命令 設置alias即可使用 [root@jimmylinux-002 mysql]# alias 'mysql=/usr/local/mysql/bin/mysql' [root@jimmylinux-002 mysql]# alias 'mysqldump=/usr/local/mysql/bin/mysqldump'

登錄mysql創建4個數據庫

恢復數據庫

登錄mysql開始實行主從

如果出現Slave_IO_Running: Connecting 的情況,需要把主機器上的firewalld關閉,然后在執行同步即可。

[root@jimmylinux-001 mysql]# systemctl stop firewalld

這個時候主從就已經建立起來了,記得要把主機器上面解鎖恢復寫數據。

[root@jimmylinux-001 mysql]# mysql -uroot -pabcd1234 登錄主機器的mysql mysql> unlock tables; 解鎖恢復寫數據 Query OK, 0 rows affected (0.00 sec)

到此整個主從就已經搭建完成了

 

17.5 測試主從同步

測試主從同步之前先了解下主、從服務器上面的配置參數

配置文件都是my.cnf

主服務器上 binlog-do-db=      //僅同步指定的庫
 binlog-ignore-db= //忽略指定庫
 從服務器上 replicate_do_db= replicate_ignore_db= replicate_do_table= replicate_ignore_table= replicate_wild_do_table=   //如jimmy.%, 支持通配符% 
 replicate_wild_ignore_table=

開始測試主、從同步

查看主機器的數據庫信息

mysql> use mysql2 Database changed mysql> show tables; +---------------------------+
| Tables_in_mysql2          |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
28 rows in set (0.00 sec) mysql> select count(*) user; +------+
| user |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

查看從機器的數據庫信息

mysql> use mysql2 Database changed mysql> show tables; +---------------------------+
| Tables_in_mysql2          |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
28 rows in set (0.00 sec) mysql> select count(*) user; +------+
| user |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

現在要在主上把這個表做一個清空操作

 從上顯示為0

再測試一個刪除表的操作

mysql> drop table user; 主上刪除user表 Query OK, 0 rows affected (0.01 sec) mysql> select * from user; 從上的表也同樣沒有了,所以會報錯不存在。 ERROR 1146 (42S02): Table 'mysql2.user' doesn't exist

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM