数据库04,用户授权及备份

一、用户授权

1.1 什么是用户授权

  在数据库服务器上添加新的连接用户,添加用户时可以设置用户权限和连接用户密码,默认数据库管理员root用户是有授权操作的

1.2 用户授权的命令格式

  grant 授权列表 on 库名 to 用户名@"客户端地址" identified by "密码"  //授权用户密码

  with grant option ;//有授权权限,可选项(加上这一句意味着新的用户也具有授权新用户的能力)

  #################################################################################

  授权列表:

  all 所有权限

  usage //无权限

  select update insert //个别权限

        select,update(字段1,字段2……) //指定字段

  库名:

  *.*   //所有库下所有表

  库名.*   //指定库下的所有表

  库名.表名    //指定库下的指定表

  用户名:

  授权时自定义,要有标识性

  存储在MySQL库的user表里

  客户端地址:

  — % //所有主机

  —192.168.4.%   //网段内的所有主机

  —192.168.4.1    //1台主机

  —localhost     //数据库服务器本机

  

1.3授权例子

  服务机本机上进行授权:

mysql> grant all on *.* to admin@"192.168.142.129" identified by "123qqq...A"
    -> ;
Query OK, 0 rows affected (1.10 sec)

  客户机上进行查看:(客户机上要查看是否有mysql 命令 which mysql 查看,若没有,安装mariadb 软件包)

[leilei@localhost ~]$ mysql -h192.168.142.140 -uadmin -p"123qqq...A"

这时在客户机上可以看到 服务及上的数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| abc123             |
| db3                |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.16 sec)

1.4相关命令

  查找添加用户

  select user();    查看已授权的用户,显示登录用户名和客户端地址,只是查看当前主机上被授权的用户是谁,无法查询所有被授权的用户

mysql> select user();  ###客户端上
+-----------------------+
| user()                |
+-----------------------+
| admin@192.168.142.129 |
+-----------------------+

mysql> select user();####数据库服务机上
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec

  show grants;用户显示自身访问权限,也只是在自身登录到的数据库下查看自身拥有的权限

mysql> show grants;#####服务机上查看
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION   

mysql> show grants;######客户机上查看
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.142.129' IDENTIFIED BY PASSWORD '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30' |

                                                              |

show grants for 用户名@"客户端地址"  管理员查看已有授权用户权限(要知道授权用户名字和客户端地址)

mysql> show grants for admin@192.168.142.129;
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for admin@192.168.142.129                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.142.129' IDENTIFIED BY PASSWORD '*F19C699342FA5C91EBCF8E0182FB71470EB2AF30' |

set password=password("密码");  授权用户登录后修改连接密码

mysql> set password=password("123");
Query OK, 0 rows affected (0.04 sec)

set password for 用户@客户端地址 =password("密码");  管理员修改授权用户的登录密码

mysql> set password for admin@192.168.142.129=password("123");
Query OK, 0 rows affected (0.00 sec)

drop user 用户名@客户端地址;  管理员权限下删除授权用户

######################################################################################################################

1.5授权库MySQL

  show databases;

  每一个数据库里都有一个mysql库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| abc123             |
| db3                |
| mysql              |
| performance_schema |
+--------------------+

在mysql库下,查看表:

  1.user  记录已有的授权用户和权限

user表下的部分字段

mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(16)                          | NO   | PRI |                       |       |
| Password               | char(41)                          | NO   |     |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |

根据字段查看权限

mysql> select user,host,password from user; ######可以查看到所有授权的用户
+-------+-----------------------+-------------------------------------------+
| user  | host                  | password                                  |
+-------+-----------------------+-------------------------------------------+
| root  | localhost             | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root  | localhost.localdomain |                                           |
| root  | 127.0.0.1             |                                           |
| root  | ::1                   |                                           |
|       | localhost             |                                           |
|       | localhost.localdomain |                                           |
| admin | 192.168.142.129       | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-------+-----------------------+-------------------------------------------+

  2.db    记录已有授权用户对数据库的访问权限

  mysql> grant all on abc123.* to mydb@localhost identified by "123"; ####增加一条本机的用户权限

  grant all on abc123.* to [email protected] identified by "123";###再添加一条客户端的授权

mysql> select user,host,db from db;#########可以看到用户admin和mydb 所在的地址及对数据库具体的权限,而上两行的%就表示对所有都有权限
+-------+-----------------+---------+
| user | host | db |
+-------+-----------------+---------+
| | % | test |
| | % | test\_% |
| admin | 192.168.142.129 | abc123 |
| mydb | localhost | abc123 |
+-------+-----------------+---------+

看到db 表中的权限后,就可以用update来修改相关权限

#flush priviles 可以来刷新修改权限后的数据库

  3.tables_priv  记录已有授权用户对表的访问权限(没有特殊对表的权限时,表内数据为空)

mysql> grant update,insert on abc123.T3 to admin@192.168.142.129 identified by "123" with grant option;
Query OK, 0 rows affected (0.04 sec)

mysql> select * from tables_priv;
+-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
| Host            | Db     | User  | Table_name | Grantor        | Timestamp           | Table_priv          | Column_priv |
+-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
| 192.168.142.129 | abc123 | admin | T3         | root@localhost | 0000-00-00 00:00:00 | Insert,Update,Grant |             |
+-----------------+--------+-------+------------+----------------+---------------------+---------------------+-------------+
1 row in set (0.00 sec)

解读:  客户端192.168.142.129 的admin用户对abc123下的T3表有insert,update,还有授予权限grant的权限,其中timestamp 为自定义的授权时间,columns_priv为字段权限

  4.columns_priv   记录已有用户对字段的权限

mysql> grant update(name,class),insert on abc123.T3 to admin@192.168.142.129 identified by "123" with grant option;
Query OK, 0 rows affected (0.07 sec)

mysql> select *from columns_priv;
+-----------------+--------+-------+------------+-------------+---------------------+-------------+
| Host            | Db     | User  | Table_name | Column_name | Timestamp           | Column_priv |
+-----------------+--------+-------+------------+-------------+---------------------+-------------+
| 192.168.142.129 | abc123 | admin | T3         | name        | 0000-00-00 00:00:00 | Update      |
| 192.168.142.129 | abc123 | admin | T3         | class       | 0000-00-00 00:00:00 | Update      |
+-----------------+--------+-------+------------+-------------+---------------------+-------------+
2 rows in set (0.00 sec)

1.6撤销授权 revoke 权限 on 库名.表名 from 用户@"客户端地址";

####这里撤销的只是权限,但是不管怎么撤销,授权用户依然可以登录数据库,只有drop  user 用户名@"客户端地址";才可以删除授权用户

mysql> revoke grant option on abc123.T3 to admin@192.168.142.129;####取消一下授权用户的授权权限
mysql> select * from tables_priv where user="admin";######这时表权限就没有了grant权限
+-----------------+--------+-------+------------+----------------+---------------------+---------------+-------------+
| Host            | Db     | User  | Table_name | Grantor        | Timestamp           | Table_priv    | Column_priv |
+-----------------+--------+-------+------------+----------------+---------------------+---------------+-------------+
| 192.168.142.129 | abc123 | admin | T3         | root@localhost | 0000-00-00 00:00:00 | Insert,Update | Update      |
+-----------------+--------+-------+------------+----------------+---------------------+---------------+---------

1.7删除授权用户

drop  user 用户名@"客户端地址"

mysql> select user,host from user;
+-------+-----------------------+
| user  | host                  |
+-------+-----------------------+
| root  | 127.0.0.1             |
| admin | 192.168.142.129       |
| root  | ::1                   |
|       | localhost             |
| mydb  | localhost             |
| root  | localhost             |
|       | localhost.localdomain |
| root  | localhost.localdomain |
+-------+-----------------------+
8 rows in set (0.00 sec)

mysql> drop user mydb@localhost;
Query OK, 0 rows affected (0.04 sec)

mysql> select user,host from user;
+-------+-----------------------+
| user  | host                  |
+-------+-----------------------+
| root  | 127.0.0.1             |
| admin | 192.168.142.129       |
| root  | ::1                   |
|       | localhost             |
| root  | localhost             |
|       | localhost.localdomain |
| root  | localhost.localdomain |
+-------+-----------------------+
7 rows in set (0.00 sec)

1.8 管理root密码

 1)恢复root密码

  —root密码忘了怎么办

  1.停止MySQL服务程序

  systemctl stop mysqld.service

  2.跳过授权表启动MySQL服务程序

  这一步主要利用mysqld的 --skip-grant-tables选项

  修改my.cnf配置,在 [mysqld] 下 添加 skip_grant_tables=1启动设置:

  之后 启动数据库服务:systemctl start mysqld.service

  直接以 mysql命令 进入数据库

  3.修改root密码

  在user表下修改用户密码:

mysql> update mysql.user set  authentication_string=password("123") where user="root" and host="localhost";
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

  之后刷新一下数据率:flush privileges;

  (通过执行“FLUSH PRIVILEGES;”可使授权表立即生效,对于正常运行的MySQL服务,也可以用上述方法来修改密码,不用重启服务。本例中因为是恢复密码,最好重启MySQL服务程序,所以上述“FLUSH PRIVILEGES;”操作可跳过。)

  exit退出数据库

  在/etc/my.cnf下把刚设置的skip_grant_tables=1 注释掉

  重新启动一下服务

4.以正常方式重启MySQL服务程序

这时再以 mysql -hlocalhost  -uroot  -p"密码"登录即可

[root@localhost ~]# mysql -hlocalhost -uroot -p123
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.45 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

这时查看一下mysql 库下的user表下的密码验证字段

mysql> select  authentication_string from mysql.user where user="root" and host="localhost"\G;
*************************** 1. row ***************************
authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
1 row in set (0.00 sec)

2)重置数据库密码:

方法一:在shell脚本命令行重置密码

[root@dbsvr1 ~]# mysqladmin -uroot -p password 'A…qqq321'                    
Enter password:                                   //验证原来的密码

方法二:以管理员身份登入数据库后修改grant

mysql> GRANT all ON *.* TO root@localhost IDENTIFIED BY '1234567';

3)方法3,以root登入mysql> 后,使用UPDATE更新相应的表记录

mysql> UPDATE mysql.user SET authentication_string=PASSWORD('1234567')
    -> WHERE user='root' AND host='localhost';          //重设root的密码
Query OK, 0 rows affected, 1 warning (0.00 sec)

4)数据库下使用set

mysql> SET PASSWORD FOR root@localhost=PASSWORD('1234567');

如果有报错,>mysql 下使用刷新命令

2.数据备份与恢复

  2.1数据备份 目的

  当数据丢失或损坏时可以使用备份恢复

  2.2 数据备份的方式

  1) 物理备份:cp  tar scp 

      恢复:在另一台主机上获得备份的数据,放于/var/lib/mysql下(把数据库数据文件夹给备份下来)

  2)逻辑备份:(使用软件自带的备份程序做备份,执行备份命令时,会根据已有的数据生成对应的命令,把命令存放到指定的备份文件里

          恢复时执行备份文件里的命令恢复)

         mysqldump   备份命令

         mysql  恢复命令

2.3 数据备份的策略

  完全备份

    —备份所有数据

  增量备份

    —备份上次的备份后,所有新产生的数据(每一次都和上一次相比,备份多出来的数据)

   差异备份:

    —备份完全备份后,所有新产生的数据(每一次都与完全备份相比,备份与完全备份不同的一部分,某些数据可能会重复备份)

2.4 完全备份

  命令:mysqldump -uroot -p“密码” 库名   > 目录/XXX.sql

  备份时的库名表示方式

  — --all-databases 或-A    //所有库

  —数据库名                //单个库

  —数据库名   表名    //单张表

  —-B  数据库1   数据库2    //多个库

  无论是备份还是恢复,都要验证用户权限

2.5 完全恢复

  如果是只备份了一个库,那么需要在数据库中建立这个库的库名,然后使用mysql -uroot -p密码 库名 < 目录/xxx.sql

  若是使用 -B,那么就无需建立库名,备份和恢复命令里会自动处理

3. 增量备份

  使用mysql服务的binlog日志实现数据的增量备份与恢复

 3.1binlog日志的使用

    3.1.1binlog 日志介绍

      1)也叫做二进制文件

      2)MySQL服务日志文件的一种

      3)记录处查询之外的所有sql命令

      4)可用于数据的备份与恢复

      5)配置MySQL主从同步的必要条件

    3.1.2启用日志

#######################################################################################################

    配置项           用途

    server_id=数字        指定id值(1-255,即启动服务的主机名)

    log-bin=目录名/文件名      启用日志

    max_binlog_size=数值m    指定日志文件的容量(当超过这个容量时,就开始另起一个日志文件默认大小为1G)

#######################################################################################################

    启动:在配置文件中[mysqld]下中指定id值和启动

    

[mysqld]
server_id=140
log_bin

然后重启一下mysqld 服务

查看是否已经启动,可以登入数据率查看:

命令:show master status可以查看当前使用的日志文件名称

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| mysqld-bin.000002 |      120 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

或者可以在/var/lib/mysql   下查看到日志文件

mysql> system ls /var/lib/mysql
abc      db3           ib_logfile1      mysqld-bin.000002  performance_schema
abc123      ibdata1      mysql          mysqld-bin.index
auto.cnf  ib_logfile0  mysqld-bin.000001  mysql.sock

其中mysqld-bin.XXXXXX为日志文件,mysqld-bin.index 为所有日志文件的索引,也就是说所有的日志文件的名字都存放在里面

可以查看一下这个索引:这里的文件名都是按照 主机名-bin-编号命名,位置也是默认在数据库文件下

mysql> system cat /var/lib/mysql/mysqld-bin.index
./mysqld-bin.000001
./mysqld-bin.000002

自定义日志文件的位置和名称:log-bin=XXX/XXX(不要建在root下就好)

要事先建立好文件夹,并赋予mysql 用户权限

    3.1.3手动创建新的binlog日志文件

      1)systemctl reatart mysqld   只要重启一下数据库服务就会生成一个新的日志文件

      2)flush logs;刷新一次生成一个新的日志文件

      3)命令行下 mysql -uroot -p密码 -e "flush logs"  (其实和 2)一个意思,只是一个在命令行下,一个在服务中),-e 是选项

      4)mysqldump  --flush-logs   (在备份数据库后新建一个日志)

      (一般后三种用的较多)

    3.1.4删除已有的binlog日志

      1)删除指定编号前的日志文件

        purge master logs to "binlog文件名"

      2)删除所有的binlog日志文件,重建新日志(删除所有日志后,会再建一个新的)

      reset master

    3.1.5查看日志内容

     1)查看内容

    mysqlbinlog /日志文件所在地址      可查看(在没有改变文件格式之前是乱码)

[root@localhost ~]# mysqlbinlog /var/lib/mqsql/mysqld-bin.000001;   ####在命令行下执行
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
mysqlbinlog: File '/var/lib/mqsql/mysqld-bin.000001' not found (Errcode: 2 - No such file or directory)
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@localhost ~]# 

    2)如何区分记录的多条命令

      1.偏移量:position

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--
------------+------------------+-------------------+ | mysqld-bin.000001 | 120 | | | | +-------------------+----------+--------------+------------------+-------------------+

show master status; 其中的position 为日志结点,若结点数值不变,那么就是数据库没有更新,日志没有改变

      --start-position=数字   起始偏移量

      --stop-position =数字  结束偏移量

      2.时间结点:

       --start-datetime ="yyyy-mm-dd hh:mm:ss"   起始时间

       --stop-datetime ="yyyy-mm-dd hh:mm:ss"  结束时间

      (只要是改变数据的命令就会有对应的偏移量和时间结点)

 3)查看日志当前格式:日志文件转化成我们能看懂的格式,就可以观察到变化的格式命令  

     日志文件的三种格式: statement       报表模式

               row      行模式

               mixed    混合模式

show variables like "binlog_format" 可以查看当前文件格式,format为变量

mysql> show variables like "binlog_format";
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

要将格式改为混合模式

步骤:  在配置文件中更改,改完需重启服务

    /etc/my.cnf

    [mysqld]

    binlog_format="MIXED"

   然后使用mysqlbinlog 来查看

 4)使用日志进行恢复/(这是在需要备份的客户端操作)

  mysqlbinlog  /日志目录    |   mysql -uroot -p密码

(将日志文件拷给备份的主机,然后把读取的日志内容管道给数据库做处理)

 若选择性读取日志文件 则   mysqlbinlog --start-position=开始偏移量 --stop-position=结束偏移量  /目录文件   |   mysql -uroot -p密码

如何找偏移量:

[root@localhost ~]# mysqlbinlog /var/lib/mysql/mysqld-bin.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#191001  8:29:28 server id 129  end_log_pos 120 CRC32 0xd69d903f     Start: binlog v 4, server v 5.6.45-log created 191001  8:29:28 at startup
ROLLBACK/*!*/;
BINLOG '
6J2SXQ+BAAAAdAAAAHgAAAAAAAQANS42LjQ1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADonZJdEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAT+Q
ndY=
'/*!*/;
# at 120
#191001  8:35:37 server id 129  end_log_pos 197 CRC32 0x3ddc78ef     Query    thread_id=2    exec_time=0    error_code=0
SET TIMESTAMP=1569890137/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 197
#191001  8:35:37 server id 129  end_log_pos 320 CRC32 0xb108bd32     Query    thread_id=2    exec_time=0    error_code=0
SET TIMESTAMP=1569890137/*!*/;
insert into abc123.T3 values("rt","2",23,"game",89)  ###如找这一条插入命令的开始与结束偏移量,往上找#开始的为开始偏移量
/*!*/;
# at 320    ###320 为输完insert 命令后的偏移量,这一条命令还没有执行
#191001  8:35:37 server id 129  end_log_pos 351 CRC32 0x85bec906     Xid = 10
COMMIT/*!*/;###commit 为提交,即回车后提交
# at 351   ###  这一条命令为用户按完回车后正式插入的偏移量
#191001  8:56:57 server id 129  end_log_pos 374 CRC32 0x301e7b58     Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@localhost ~]# 

故这一条插入命令的偏移量为  197-351

猜你喜欢

转载自www.cnblogs.com/zhanglei97/p/11610473.html