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