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)



从测试的结果来看,在主库上创建了两个表,而在从库只有我指定复制的那张表的数据同步了过来,其他的都没有。