MySQL生產環境下的主從複製啟動項
MySQL的複製引數除了我們之前搭建主從時遇到的那幾個之外,還有以下兩個:
1、log-slave-updates
這個引數用來配置從庫上是否啟動了二進位制日誌的功能,預設是不開啟的,如果開啟了那麼從庫上的更新操作將會被記錄到二進位制日誌中。
不過在級聯複製的架構中,比如某個從庫A也要作為其他伺服器的主庫,像這種鏈式的複製架構下,這個從庫就需要開啟此引數,因為從庫A下面的從庫還需要在從庫A上獲得二進位制日誌並進行同步操作。
2、read-only
此引數在生產環境中用的比較多,在生產環境中,從庫一般讀操作比較多,因為研發人員需要進行大量的查詢,因此這個引數要設定,也就是隻有超級使用者可以進行更新操作。 這樣子研發人員就不會亂刪資料了,給我們運維找麻煩。
下面我們來演示一下操作步驟:
(1)、首先在主庫上建立一個賬號:
mysql> grant all privileges on haha.* to 'test'@'%' identified by '12345'; Query OK, 0 rows affected, 1 warning (0.01 sec)
(2)、從庫上如果直接使用這個賬戶test登入從庫的話,是可以刪除資料的。所以我們需要繼續設定。
(3)、關閉從庫,使用read-only選項啟動從資料庫。
[[email protected]:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#mysqladmin -uroot -p123456 shutdown 2019-01-03T07:56:25.248454Z mysqld_safe mysqld from pid file /data/data_mysql/mysql.pid ended [1]+ Done mysqld_safe --read-only [[email protected]:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#mysqld_safe --read-only& [1] 909 [[email protected]:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#2019-01-03T07:56:38.797120Z mysqld_safe Logging to '/usr/local/mysql/logs/mysql.log'. 2019-01-03T07:56:38.826034Z mysqld_safe Starting mysqld daemon with databases from /data/data_mysql
(4)這個時候我們在從庫上使用賬戶test來登入,注意是從庫。然後進行刪除操作。
[[email protected]:vg_adn_tidbCkhsTest:34.202.241.16:172.31.26.133 /usr/local/mysql/bin]#mysql -utest -p12345 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 5
MySQL [(none)]> use haha Database changed MySQL [haha]> select * from hehe where id=7; +------+----------+ | id | name | +------+----------+ | 7 | xiaowang | +------+----------+ 1 row in set (0.00 sec) MySQL [haha]> delete from hehe where id = 7; ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
可以看到使用read-only選項登入的從資料庫是拒絕普通使用者的更新操作,以確保資料庫的安全。
注意:今天我也做過其他的試驗:比如在從庫上建立一個賬戶然後賦予許可權,然後再set global read-only=1,(我在my.cnf檔案中也設定了read-only=ON)發現即使這樣子設定後這個賬戶登入後仍然是可以刪除資料的,後來做了上面的這幾個步驟就成功了,因此我覺得大概有兩種方法來確保從庫進行讀操作而不能更新,一個是上面的方法,還有一個是建立的使用者僅僅賦予select查詢許可權,然後使用這些普通使用者登入,禁止他們修改資料。當然第一種方法最常見。
指定複製的資料庫或者表
有時候使用者只需要將關鍵的資料庫或者表備份到從庫上,那麼我們可以設定一下幾個值:
replicate-do-db #需要複製的資料庫 replicate-do-table #需要複製的資料庫的表 replicate-ignore-db #不需要複製的資料庫 replicate-ignore-table
以上的引數可以在my.cnf中設定,當然也可以在mysql的啟動引數裡面進行設定。如果需要指定同步多個數據庫或表,依次重複寫就可以了。
現在我們做個實驗:只複製主庫的fruit資料庫下的apple這個表,而orange表則不復制。
(1)、在主庫上建立資料庫和兩個表
mysql> create database fruit; Query OK, 1 row affected (0.00 sec) mysql> use fruit Database changed mysql> create table apple( -> id tinyint, -> address char(16) -> ); Query OK, 0 rows affected (0.02 sec) mysql> create table orange( id tinyint, address char(16) ); Query OK, 0 rows affected (0.01 sec) mysql> insert into apple values (1,'shandong'); Query OK, 1 row affected (0.00 sec) mysql> insert into orange values (1,'hainan'); Query OK, 1 row affected (0.00 sec)
(2)、從庫以指定複製表的引數啟動
[[email protected]:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#mysqld_safe --replicate-do-table=fruit.apple & #以指定複製表的引數進行啟動 [1] 18874 [[email protected]:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#2019-01-03T09:04:13.797663Z mysqld_safe Logging to '/usr/local/mysql/logs/mysql.log'. 2019-01-03T09:04:13.827186Z mysqld_safe Starting mysqld daemon with databases from /data/data_mysql [[email protected]:vg_adn_tidbCkhsTest:34.202.241.16:172.31.26.133 /usr/local/mysql/bin]#mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 4
MySQL [(none)]> use fruit Database changed MySQL [fruit]> show tables; #我發現只有一張表,而沒有orange這個表 +-----------------+ | Tables_in_fruit | +-----------------+ | apple | +-----------------+ 1 row in set (0.00 sec) MySQL [fruit]> select * from apple; +------+----------+ | id | address | +------+----------+ | 1 | shandong | +------+----------+ 1 row in set (0.00 sec)
從測試的結果來看,在主庫上建立了兩個表,而在從庫只有我指定複製的那張表的資料同步了過來,其他的都沒有。