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)

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

原文地址:https://www.cnblogs.com/FengGeBlog/p/10215652.html