mysql用户权限设置,主从服务复制配置和数据库只读权限设置

一、权限设置

1、连接到本机上的MYSQL。

首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。

如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>

修改密码

use mysql;

update user set password=password(‘root’) where user=’root’;

flush privileges;

exit;

允许广域网访问

use mysql;

 例如: 你想remoteRoot使用root(密码)从任何主机连接到mysql服务器的话。

  mysql>GRANT ALL PRIVILEGES ON *.* TO ‘remoteRoot’@’%’IDENTIFIED BY ‘root‘ WITH GRANT OPTION;

  如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码

  mysql>GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’192.168.1.3’IDENTIFIED BY

  ’mypassword’ WITH GRANT OPTION;

   mysql>FLUSH PRIVILEGES;

  使修改生效,就可以了

普通用户权限

如果想指定部分权限给一用户,可以这样来写:

  mysql>grant select,insert,update,delete on *.* to remoteRoot@localhost identified by ‘root‘;

  mysql>flush privileges; //刷新系统权限表

删除用户进入mysql数据库

mysql>use mysql;

mysql>DELETE FROM user WHERE User=”phplamp” and Host=”localhost”;

mysql>flush privileges;

2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

    mysql -h10.162.163.23 -u remoteRoot -p root;(注:u与root之间可以不用加空格,其它也一样)

3、退出MYSQL命令: exit (回车)

二、主从服务复制配置

1、主从服务器分别作以下操作:

  1.1、版本一致

  1.2、初始化表,并在后台启动mysql

  1.3、修改root的密码

2、修改主服务器master:

   #vi /etc/my.cnf

       [mysqld]

       log-bin=mysql-bin #//[必须]启用二进制日志

       server-id=222 #//[必须]服务器唯一ID,默认是1,一般取IP最后一段

3、修改从服务器slave:

   #vi /etc/my.cnf

       [mysqld]

       log-bin=mysql-bin   #//[不是必须]启用二进制日志

       server-id=226      #//[必须]服务器唯一ID,默认是1,一般取IP最后一段

4、重启两台服务器的mysql

   /etc/init.d/mysql restart或者service mysqld restart

5、在主服务器上建立帐户并授权slave:

   #/usr/local/mysql/bin/mysql -uroot -proot   

   mysql>GRANT REPLICATION SLAVE ON *.* to ‘remoteRoot’@‘%’ identified by ‘remoteRoot’; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

6、登录主服务器的mysql,查询master的状态

   mysql>show master status;

   +——————+———-+————–+——————+

   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

   +——————+———-+————–+——————+

   | mysql-bin.000004 |      308 |              |                  |

   +——————+———-+————–+——————+

   1 row in set (0.00 sec)

   注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

7、配置从服务器Slave:

   mysql>change master to master_host=’172.17.175.24‘,master_user=’remoteRoot’,master_password=’071451′,master_log_file=’mysql-bin.000001′,master_log_pos=403;   //注意不要断开,308数字前后无单引号。

   Mysql>start slave;    //启动从服务器复制功能

8、检查从服务器复制功能状态:

   mysql> show slave status\G

   *************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

              Master_Host: 192.168.2.222  //主服务器地址

              Master_User: mysync   //授权帐户名,尽量避免使用root

              Master_Port: 3306    //数据库端口,部分版本没有此行

              Connect_Retry: 60

              Master_Log_File: mysql-bin.000004

              Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos

              Relay_Log_File: ddte-relay-bin.000003

              Relay_Log_Pos: 251

              Relay_Master_Log_File: mysql-bin.000004

              Slave_IO_Running: Yes    //此状态必须YES

              Slave_SQL_Running: Yes     //此状态必须YES

                    ……

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

  

9、主从服务器测试:

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

  mysql> create database hi_db;

  Query OK, 1 row affected (0.00 sec)

  mysql> use hi_db;

  Database changed

  mysql>  create table hi_tb(id int(3),name char(10));

  Query OK, 0 rows affected (0.00 sec)

 

  mysql> insert into hi_tb values(001,’bobu’);

  Query OK, 1 row affected (0.00 sec)

  mysql> show databases;

   +——————–+

   | Database           |

   +——————–+

   | information_schema |

   | hi_db                |

   | mysql                |

   | test                 |

   +——————–+

   4 rows in set (0.00 sec)

从服务器Mysql查询:

   mysql> show databases;

   +——————–+

   | Database               |

   +——————–+

   | information_schema |

   | hi_db                 |       //I’M here,大家看到了吧

   | mysql                 |

   | test          |

   +——————–+

   4 rows in set (0.00 sec)

   mysql> use hi_db

   Database changed

   mysql> select * from hi_tb;           //查看主服务器上新增的具体数据

   +——+——+

   | id   | name |

   +——+——+

   |    1 | bobu |

   +——+——+

   1 row in set (0.00 sec)

 

10、完成:

    编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

解除主从关系

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> reset slave;

Query OK, 0 rows affected (0.02 sec)

重启mysql

mysql> show slave status\G

问题解决方案:

方法1:跳过错误Event

先跳过这一条错误(event),让主从同步恢复正常。(或者N条event,一条一条跳过)

  stop slave;

  set global sql_slave_skip_counter=1;

  start slave;

 

方法2:跳过所有1032错误

更改my.cnf文件,在Replication settings下添加:

  slave-skip-errors = 1032

并重启数据库,然后start salve。

注意:因为要重启数据库,不推荐,除非错误事件太多。

 

方法3:还原被删除的数据

根据错误提示信息,用mysqlbinlog找到该条数据event SQL并逆向手动执行。如delete 改成insert。

本例中,此事件在主服务器Master binlog中的位置是 mysql-bin.000003, end_log_pos 440267874。

1)利用mysqlbinlog工具找出440267874的事件

/usr/local/mysql-5.6.30/bin/mysqlbinlog –base64-output=decode-rows -vv mysql-bin.000003 |grep -A 20 ‘440267874’

或者/usr/local/mysql-5.6.30/bin/mysqlbinlog –base64-output=decode-rows -vv mysql-bin.000003 –stop-position=440267874 | tail -20

或者usr/local/mysql-5.6.30/bin/mysqlbinlog –base64-output=decode-rows -vv mysql-bin.000003 > decode.log 

( 或者加上参数-d, –database=name 来进一步过滤)

三、数据库只读设置

对于mysql单实例数据库和master库,如果需要设置为只读状态,需要进行如下操作和设置:
      MySQL设置为只读状态的命令:
# mysql -uroot -p
mysql> show global variables like “%read_only%”;
mysql> flush tables with read lock;
mysql> set global read_only=1;
mysql> show global variables like “%read_only%”;

MySQL从只读设置为读写状态的命令:
mysql> unlock tables;
mysql> set global read_only=0;

      对于需要保证master-slave主从同步的salve库,如果要设置为只读状态,需要执行的命令为:
mysql> set global read_only=1;

     salve库从只读状态变为读写状态,需要执行的命令是:
mysql> set global read_only=0;

     对于数据库读写状态,主要靠 “read_only”全局参数来设定;默认情况下,数据库是用于读写操作的,所以read_only参数也是0faluse状态,这时候不论是本地用户还是远程访问数据库的用户,都可以进行读写操作;如需设置为只读状态,将该read_only参数设置为1TRUE状态,但设置 read_only=1 状态有两个需要注意的地方:
      1.read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过 show slave status\G 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致;
      2.read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作;在MySQL中设置read_only=1后,普通的应用用户进行insertupdatedelete等会产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有super权限的用户,例如在本地或远程通过root用户登录到数据库,还是可以进行数据变化的DML操作;


      为了确保所有用户,包括具有super权限的用户也不能进行读写操作,就需要执行给所有的表加读锁的命令 “flush tables with read lock;”,这样使用具有super权限的用户登录数据库,想要发生数据变化的操作时,也会提示表被锁定不能修改的报错。


        这样通过 设置“read_only=1”“flush tables with read lock;”两条命令,就可以确保数据库处于只读模式,不会发生任何数据改变,在MySQL进行数据库迁移时,限定master主库不能有任何数据变化,就可以通过这种方式来设定。


       但同时由于加表锁的命令对数据库表限定非常严格,如果再slave从库上执行这个命令后,slave库可以从master读取binlog日志,但不能够应用日志,slave库不能发生数据改变,当然也不能够实现主从同步了,这时如果使用 “unlock tables;”解除全局的表读锁,slave就会应用从master读取到的binlog日志,继续保证主从库数据库一致同步。

       为了保证主从同步可以一直进行,在slave库上要保证具有super权限的root等用户只能在本地登录,不会发生数据变化,其他远程连接的应用用户只按需分配为select,insert,update,delete等权限,保证没有super权限,则只需要将salve设定“read_only=1”模式,即可保证主从同步,又可以实现从库只读。

       相对的,设定“read_only=1”只读模式开启的解锁命令为设定“read_only=0”;设定全局锁“flush tables with read lock;”,对应的解锁模式命令为:“unlock tables;”.

      当然设定了read_only=1后,所有的select查询操作都是可以正常进行的。

    原文作者:蓝明云
    原文地址: https://blog.csdn.net/zleiw/article/details/78243316
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞