mysql 安全和日志 备份
一,mysql 安全机制管理
1.权限表
mysql 数据库中得表说明
- mysql.user
- 用户字段:Host,User,Password
- 权限字段:_priv结尾的字段
- 安全字段:ssl x509字段
- 资源控制字段:max_开头的字段
- mysql.db
- 用户字段:Host,User,Db
- 权限字段:剩下的_priv结尾的字段
- mysql.tables_priv,mysql.columns_priv,procs_priv
- 表,列,存储过程的授权表
- 授权级别排列
- mysql.user # 全局授权
- mysql.db # 数据库级别授权
- 其他 # 表级,列级 授权
2.用户管理
2.1 登录
# mysql -h192.168.16.135 -P 3306 -uroot -p123456 mysql -e ‘select user,host,password from user’;
-h 指定主机名 【默认为localhost】
-P 服务端口号默认为3306
-u 指定用户名 默认为root
-p 指定登录密码
‘mysql’ 为指定登录的库
-e 接sql 语句
2.2 退出
mysql > exit;
mysql> quit;
2.3 创建用户
①create user 语法
mysql> create user [email protected]‘host’ identified by ‘password’;
② grant 语法
可以直接创建用户,不需要create
mysql> grant all on *.* to 'username'@'host' identified by '123456';
2.4 用户权限管理
user 全局权限 => db 库权限 => tables_priv 表权限 => columns_priv 字段权限
语法格式:
① 授权操作
grant 权限列表 on 库名.表名 to ‘username’@'host' [identified by 'password' with option 参数]
权限列表 all 所有权限 (不包含授权grant 权限)
select,update
库名.表名 *.* 所有库下的所有表 global level
devops.* devops 库下的所有表 database level
devops.student devops 库下的 student 表的 table level
select (col1),insert(col1.col2)on devops.student column level
host % 所有主机
192.168.16.% 192.168.16.0 网段的所有主机
192.168.16.100 指定主机
localhost 指定本地主机
with_option 参数:
GRANT OPTION: 授权选项
MAX_QUERIES_PER_HOUR: 定义每小时允许执行的查询数
MAX_UPDATES_PER_HOUR: 定义每小时允许执行的更新数
MAX_CONNECTIONS_PER_HOUR: 定义每小时可以建立的连接数
MAX_USER_CONNECTIONS: 定义单个用户同时可以建立的连接数
②查看权限
语法:
mysq> show grants\G;
mysql> show grants for [email protected]'localhost'\G;
③ 回收权限
revoke 权限列表 on 库名.表名 from 用户名@‘主机’
收回部分权限
mysql> revoke delete on *.* from [email protected]'localhost';
回收所有权限
mysql> revoke all [privileges] on *.* from [email protected]'localhost';
回收所有权限包括授权权限
mysql> revoke all privilegs;
2.5 删除用户
① drop user 语句 不用刷新权限
drop user ‘用户名’@‘主机’
② delete 语句
mysql> delete from mysql.user where user=‘play’ and host=‘localhost’;
mysql> flush privileges;(刷新权限)
2.6 修改用户密码
① 修改自己的密码
方法1:
shell> mysqladmin -uroot -p123456 password 'newpassword'
方法2:
mysql> updata mysql.user set password = password('newpassword') where user='devpos' and host = 'localhost';
mysql> flush privileges;
注:使用系统设置的命令,不需要刷新权限表, 如果使用GURD 语法操作,需要刷新表权限
②root 用户修改其他用户密码
方法1:
mysql> set password for [email protected]'localhost' =password(newpassword);
方法2:
mysql> updata mysql.user set password=password(newpassword) where user='devops' and host='localhost'
mysql> flush privileges
2.7 丢失重置 root 密码
方法1:
通过/etc/my.cnf 绕过校验权限
重启mysql 直接 mysql 登录
直接修改
注:修改完了要把 配置文件里的 skip-grant-tables 去掉
2.8案例 创建远程管理用户
真实服务器中,root 不允许远程登录,一个业务,使用一个数据库,对应使用一个用户
tp5shop 项目,select,update,不让delete,权限控制在tp5shop.*,登录限制在192.168.17.% 网段
mysql>grant select,update,insert on tp5shop.* to '[email protected]'192.168.17.%' identified by '^RhP*csCz^SJkLJm*3SmsLv4DHn9X#GI';
修改web 服务器中链接数据的配置文件
二,mysql 日志管理
mysql 常见日志类型
error log 错误日志 排错
bin log 二进制日志 备份 增量备份 复制(主从复制) DDL DML DCL
- DDL 语句 数据库定义语言 : 数据库,表,索引等 CREATE DROP ALTER //开发人员
- DML 语句 数据库 操纵语言:插入数据INSERT,删除数据 DELETE,更新数据 UPDATE // 开发人员
- DQL 语句 数据库查询语言: 数据查询 select //开发运维人员
- DCL 语句 数据库控制语言:例如孔子用户访问权限 grant,revoke // 运维人员
relay log 中继日志 复制 接受replication master
slow log 慢查询日志 优化 查询时间超过指定值(long_query_titme)
1. error log 日志
mysql 安装完 默认生成了
开启 修改方法 :
/etc/my.cnf
创建错误日志 目录
修改文件属主 属组
2. bin log 日志
默认是不开启的
开启方法:
/etc/my.cnf 配置文件添加下面 参数
重启服务
注:
1.重启mysqld 会截断 重新生成
2.mysql> flush privileges 会截断 重新生成
3.mysql> reset master 删除所有bin log
4.暂停 仅当前会话
mysql> SET SQL_LOG_BIN = 0
mysql> SET SQL_LOG_BIN =1
5.截取 bin log
all:
shell> mysqlbinlog mysql-bin.xxxx
datetime:
shell > mysqlbinlog mysql.000002 --start-datetime="2018-5-28 10:02:56"
shell > mysqlbinlog mysql.000002 --stop-datetime="2018-5-28 11:02:54"
shell > mysqlbinlog mysql.000002 --start-datetime="2018-5-28 10:02:56" --stop-datetime="2018-05-28 11:02:54"
position:
shell > mysqlbinlog mysql.000002 --start-position=260
shell > mysqlbinlog mysql.000002 --stop-position=260
shell > mysqlbinlog mysql.000002 --start-position=260 --stop-position=930
恢复数据
shell > mysqlbinlog mysql:000001 --start-position=527 --stop-position=682 | mysql -uroot -p123456
通过时间点和为止进行数据恢复,相当于把对应的sql 重新 在执行一遍 重放
3. slow log 日志
慢查询日志记录 mysql 中设置long_query_time ,如果执行的sql 语句,超过此时间,就被认为是一个慢查询,被记录到slow-log里
/etc/my.cnf
slow_query_log=1
slow_query_log_file=/usr/localmysql/daa/slow.log
long_query_time=2
重启服务 ,测试效果
三,mysql 数据备份
1.备份要点
databases data 数据
bin-log 记录整个 DML insert update delete
my.cnf 配置文件
所有备份数据都应放在 非数据库本地(异地容灾,灾备),而且建议有多分副本
测试环境中做日常恢复演练,恢复较备份更为重要
备份过程中 必须要考虑因素
1.数据的一致性
2.服务的可用性
2.备份方式
物理备份
直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的(innodb)mysql 版本
逻辑备份
备份是建表,建库,插入等操纵所执行SQL 语句(DDL DML DCL) 适用于中小型数据库,效率相对较低
3.备份影响
热备份值得是当数据库进行备份时,数据库的读写操作均不受影响
温备份指的是 当数据库进行备份时,数据库的读操作可以执行,但是不能执行写操作
冷备份指的是当数据库进行备份时,数据库不能进行读写操作,即数据库要下线
4.备份范围的粒度
等级
完全备份 所有数据进行备份
增量备份 新增的数据进行备份
5.tar 方式打包备份
把/usr/localmysql/data 里的数据文件全部打包压缩备份
建立一个备份文件夹
shell> mkdir /mysqlbackup
执行压缩打包命令
shell > tar -cf /mysqlbackup/`date + %F`-mysql-all.tar -C /usr/local/mysql/data
模拟恢复
误操作库被drop 了
解压 复制所有备份文件到/usr/localmysql/data ,注意 data 文件夹及其子文件都是需要mysql 所属的 需要读写操作
一定要注意mysql版本要一致
注:冷备份一定要停服务 不然服务运行状态 执行数据库文件系统备份是无效的
启动 mysql 并进入 查看
数据库 已经恢复了
通过脚本方式 定时备份 并远程传输到指定的备份服务器 实现远程备份(容灾,灾备)
设置 ssh 免密 登录远程 备份服务器
执行 查看效果
加入计划任务定时 执行该脚本
6.percona-xtrabackup 备份
percona
要使用percona-xtrabackup 在配置文件里设置
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
安装 percona-xtrabackup
shell> wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
shell > yum -y install libev l ibaio-devel
shell > yum -y install numactl
shell > yum install peril-DBD-MySQL
shell > rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
备份
完全备份
shell > mkdir /xtrabackup/full -p
shell > innobackupex --host=127.0.0.1 --user=root --password='123456' /xtrabackup/full/
看到 这些信息说明已经备份成功了
准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 因此此时数据文件扔梳理不一致状态。准备的主要作用正式通过回滚未提交的事务ji及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
命令如下
shell > innobackupex --apply-log /xtrabackup/full/2018-08-02_18-40-22/
看到如下信息就 完成了
模拟恢复
再次drop 掉数据库
恢复命令
shell > innobackupex --copy-back /xtrabackup/full/2018-05-28_17-40-31
shell > chown -R mysql:mysql /usr/local/mysql/data
注意 执行前要把数据库停掉 而且要把原来的数据文件 备份到别的地方 不然会有下面提示 不能恢复
执行完 看到下面信息说明恢复完成 接下来给权限
启动 服务 查看
数据库又完全恢复了
增量备份
注意增量备份仅能应用于InnoDB 的XtraDB 表 对于MyISAM 表而言,执行增量备份时其实进行的是完全备份
备份命令
shell > innobackupex --host=127.0.0.1 --user=root --password='123456' --incremental /xtrabackup/add/ --incremental-basedir=/xtrabackup/full/
增量+全量 => 恢复 命令
shell > innobackupex --apply-log --redo-only /xtrabackup/full/2018-08-02_18-40-22/
shell > innobackupex --apply-log --redo-only /xtrabackup/full/2018-08-02_18-40-22/ --incremental-dir=/xtrabackup/add/2018-05-30_00-00-00/
shell > innobackupex --copy-back /xtrabackup/full/2018-08-02_18-40-22/
增量备份恢复方法和完整备份的方式完全一样,注意文件和目录的权限
7.mysqldump 备份
语法: mysqldump -h 服务器 -u用户名 -p密码 -B 数据库名 > 备份文件.sql
关于数据库名:
-A ,--all-databases 所有库
tp5shop 指定数据库名
tp5shop tpshop_user 表示 tp5shop de tpshop_user表
-B, --databases tp5shop devops 多个数据库
-d 不要数据只要表结构
逻辑备份 热备 效率不高 生成所有的sql 语句
备份
注:警告信息是 提示 在命令行上使用密码不安全的 不在命令行输 隐藏输入比较安全 这里 因为演示方便
恢复
方法1:
方法2: