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选项启动从数据库。
[root@: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 [root@:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#mysqld_safe --read-only& [1] 909 [root@: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来登录,注意是从库。然后进行删除操作。
[root@: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)、从库以指定复制表的参数启动
[root@:vg_adn_tidbCkhsTest:172.31.26.133 /usr/local/mysql/bin]#mysqld_safe --replicate-do-table=fruit.apple & #以指定复制表的参数进行启动 [1] 18874 [root@: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 [root@: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)
从测试的结果来看,在主库上创建了两个表,而在从库只有我指定复制的那张表的数据同步了过来,其他的都没有。