1. 程式人生 > >MySQL生產環境下的主從複製啟動項

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)

從測試的結果來看,在主庫上建立了兩個表,而在從庫只有我指定複製的那張表的資料同步了過來,其他的都沒有。