1.用户授权
1.1用户授权
1.1.1grant授权命令
1)格式
grant 权限列表 on 库名.表名 to 用户名@"客户端地址" identified by '密码' [with grant option]
权限列表:
all : 所有权限
usage : 无权限
insert,delete,update,select,... :部分权限
insert(字段,...),delete(字段,...),... : 指定字段权限
库名.表名:
*.* : 所有库
mysql.* : mysql库
mysql.user : mysql库的user表
登录用户:
-由两部部分组成: 用户名 (和) 客户端地址,必须两个都满足才能远程登录到数据库服务器.
-用户名:
-授权时自定义 要有标识性
-存储在mysql库的user表里
-客户端地址:
%:表示所有主机地址
192.168.4.%:表示4网段的主机
192.168.4.51:单个主机
localhost:本机数据库服务器
2)案例1:
grant all on *.* to hly@"192.168.4.%" identified by '123qqq...A' with grant option
1.1.2相关命令
1)远程登录用户常用指令(command)
select user() //查看数据库当前登录用户
show grants //查看当前用户权限
show grants for 用户@"客户端地址" //管理员查看已授权用户的权限
set password=password("密码") //用户为自己设置新的密码(password():是加密函数)
select //查看(在屏幕上显示)
mysql> select password("123456");
+-------------------------------------------+
| password("123456") |
+-------------------------------------------+
| *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
set password for 用户@"客户端地址" =password("密码") //管理员为用户设置新的密码===grant命令也可以设置密码
drop 用户名@"客户端地址" //管理员删除授权用户
1.1.3授权库
1)mysql库 记录授权信息:
-mysql.user:存储(记录)授权的 所有用户和 对应的权限是否拥有 (user表里 的 权限是指 该用户对 所有库,所有表 的 权限是否拥有)
管理工具下 会 有多个库 ,所以 这个表 下对应 的权限就是 对 所有库所有表的权限
此表的权限范围:所有库,所有表
此表的权限类型:根据管理员 授予的 权限
-mysql.db : 存储用户对某一个数据库的权限
(db表里 的 权限是指 该用户对 某一个数据库 的权限是否拥有)
库里会有多个表,所以 给库 授予什么权限, 授权用户就是对库下的(所有)表或者数据可以有什么样的操作
这个表下 对应的权限 就是 对该库下的所有表或数据的 权限
此表的权限范围:某一个库(对应下的所有表,数据等等)
此表的权限类型:根据管理员 授予的 权限
-mysql.tables_priv : 存储用户对表的权限
(tables_priv表里 的权限 是指
1>该用户 对某张表 有什么权限,
2>同时也会显示 该用户 对 表中的某个字段 所拥有的权限,但是不够具体,只显示权限,但是不显示,哪个字段对应哪个权限.)
此表的权限范围:某一个表
此表的权限类型:根据管理员 授予的 权限
-mysql.columns_priv : 存储用户对字段的权限
(columns_priv表里 的权限 是指 该用户 对 表中 某个字段 有什么权限)
此表的权限范围:某一个表
此表的权限类型:根据管理员 授予的 权限
个人理解(权限的类型):
不同的 类型的 东西 对应的权限 也不同
授予不同的 命令使用 也就相当于 授予对应的权限使用
如:
数据对应的权限:insert;delete;update;select等
表结构对应的权限:alter,....等
查看表记录可以获取用户权限,也可以通过修改表记录,修改授权用的权限
update mysql.tables_priv set table_priv="select,update,insert,delete" where user="admin"; //通过修改表记录 更改授权用户的权限
flush privileges; //刷新表记录
show grants for admin@"192.168.4.%"
2)案例:
对一台数据库,首要三步走:
1)管理员查看所有的授权用户:
select host,user from mysql.user;
2)管理员根据命令查看每一个授权用户 有什么权限
show grants for 用户名@"客户端地址";
3)再根据权限,可以到对应的表中 查看 对应的信息
mysql.user ; mysql.db ; mysql.tables_priv ; mysql.columns_priv
1.1.4撤销授权
1)//取消授权用户的某项权限,不删除用户
revoke 权限列表 on 库名.表名 from 用户@客户端地址
2)案例
revoke all on webdb.* from webuser@"%"
grant select on webdb.* to webuser@"%"
1.2root密码
1.2.1重置root密码
1)在shell命令行修改登录
-需要验证旧密码
]#mysqladmin -uroot -p旧密码 password '新密码';
2)恢复root密码
-不需要验证旧密码
]#vim /etc/my.cnf
[mysqld]
.. ..
skip-grant-tables
]#systemctl restart mysqld
]#mysql
mysql>update mysql.user set authentication_string=password("密码") where user="root" and host="localhost" ;
mysql>flush privileges;
备份的方式:
物理备份:cp;tar
逻辑备份:mysqldump(完全备份) ;binlog(增量备份)---mysql自己的备份方式
innobackupex:一款基于mysql的备份软件,可以实现完全备份,增量备份
2完全备份
2.1备份概述
2.1.1数据备份的方式
1)物理备份
-冷备份:cp,tar,.. ..
2)逻辑备份
-mysqldump //备份命令
-mysql //恢复命令
2.1.2物理备份及恢复
1)备份操作
-cp -r /var/lib/mysql /备份目录/mysql.bak
-tar -zcf /root/mysql.tar.gz /var/lib/mysql/*
2)恢复操作
-cp -r /备份目录/mysql.bak/* /var/lib/mysql/
-tar -xf /root/mysql.tar.gz -C /var/lib/mysql/
-chown -R mysql:mysql /var/lib/mysql
2.2逻辑备份
2.2.1数据备份策略
1)完全备份
-备份所有数据
2)增量备份
-备份上次备份后,所有新产生的数据
3)差异备份
-备份完全备份后,所有新产生的数据
2.2.2完全备份及恢复
1)完全备份
]#mysqldump -uroot -p密码 库名 > /目录/xxx.sql
2)完全恢复
]#mysql -uroot -p密码 [库名] < /目录/xxx.sql
3)备份时库名表示方式
- --all-databases or A //所有库
- -B 库名1 库名2 库名3 ... //多个库
- 库名 //单个库
- 库名 表名 //单个表
4)注意事项(原理):
-无论是备份还是恢复, 都要验证用户权限
-恢复所有库或多个库时,不需要指定库名(因为恢复的文件,会先判断 恢复的库 是否存在,若存在 则删除并重新建库恢复)
-恢复单个库的时候,需要指定库名(因为恢复的文件中,没有建库的语句在里面,但是会判断恢复的表是否存在,若存在则删除,重新创建并恢复)
-恢复单个表的时候,需要指定库名(因为恢复的文件中,没有建库的语句在里面,但是会判断恢复的表是否存在,若存在则删除,重新创建并恢复)
3增量备份
3.1binlog日志
3.1.1日志概述
1)什么是binlog日志
-也称作 二进制日志
-MySQL服务日志文件的一种
-记录除查询之外的所有SQL命令
-可用于数据备份和恢复
-配置mysql主从同步的必要条件
3.1.2启用日志
1)步骤
vim /etc/my.cnf
[mysql]
log_bin=/logdir/hly //启用binlog日志
server_id=50 //指定服务id值
max_binlog_size=500m //指定日志文件容量,默认1G
:wd
mkdir /logdir
chown mysql /logdir
systemctl restart mysqld
mysql -uroot -p123qqq...A
show master status;
create database db5;
create table db5.t1(id int);
insert into db5.t1 values(100);
insert into db5.t1 values(200);
insert into db5.t1 values(300);
show master status;
1.1)binlog相关文件
-主机名-bin.index //索引文件,如果配置文件中指定了binlog日志文件名,则是 文件名.index 文件名.000001 文件名.000002
-主机名-bin.000001 //第1个二进制日志
-主机名-bin.000002 //第2个二进制日志
-.. ..
2)生成新的日志文件
手动:1> mysql>flush logs;
== #mysql -uroot -p123qqq...A -e "flush logs"
show master status; //查看当前使用日志状态,记录日志也会在当前使用日志 记录
2> systemctl restart mysqld
在完全备份之后生成新的日志文件:
1> mysqldump -uroot -p123qqq...A --flush-logs db5 > /root/db5.sql
mysqldump -uroot -p123qqq...A --flush-logs -B db3 db5 > /root/db3-5.sql //备份几个数据库,就新生成几个日志文件
show master status;
3.1.3清理日志
1)删除指定编号之前的binlog日志文件
mysql> purge master logs to "hly.000004";
Query OK, 0 rows affected (0.06 sec)
2)删除所有binlog日志,并重新生成新日志
mysql> reset master;
Query OK, 0 rows affected (0.13 sec)
mysql> show master status;
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| hly.000001 | 154 | | | |
+------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3)rm -rf /logdir/*
mysql> reset master;
3.2恢复数据
3.2.1分析日志
1)查看日志当前记录格式
mysql>show variables like "binlog_format";
三种记录方式:
1.statement //报表模式
2.row //行模式(二进制)
3.mixed //混合模式(有源码)
2)修改日志记录格式
]#vim /etc/my.cnf
[mysqld]
.. ..
binlog_format="名称"
3)查看日志内容
-mysqlbinlog [选项] /目录/binlog日志文件名
选项:
--start-datetime="yyyy-mm-dd hh:mm:ss" 起始时间
--stop-datetime="yyyy-mm-dd hh:mm:ss" 结束时间
--start-position=数字 起始偏移量
--stop-position=数字 结束偏移量
3.2.2恢复数据
1)基本思路
-使用mysqlbinlog提起历史SQL操作
-通过管道交给mysql 命令执行
2)命令格式
-mysqlbinlog /目录/日志文件 | mysql -uroot -p密码
3)应用示例
使用编号为3的日志文件恢复数据
mysqlbinlog --start-position=223 --stop-position=896 /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p123qqq...A