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 username@‘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 devops@'localhost'\G;

③ 回收权限 

revoke  权限列表 on 库名.表名 from  用户名@‘主机’

收回部分权限

mysql> revoke delete on *.* from play@'localhost';

回收所有权限

mysql> revoke all [privileges] on *.* from play@'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 devops@'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 登录

直接修改

mysql 安全和日志 备份_第1张图片

注:修改完了要把 配置文件里的 skip-grant-tables 去掉 


2.8案例 创建远程管理用户

真实服务器中,root 不允许远程登录,一个业务,使用一个数据库,对应使用一个用户 

tp5shop 项目,select,update,不让delete,权限控制在tp5shop.*,登录限制在192.168.17.% 网段

mysql>grant select,update,insert on tp5shop.* to 'tp5shop@'192.168.17.%' identified by '^RhP*csCz^SJkLJm*3SmsLv4DHn9X#GI';

修改web 服务器中链接数据的配置文件

 

mysql 安全和日志 备份_第2张图片

mysql 安全和日志 备份_第3张图片


二,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

mysql 安全和日志 备份_第4张图片
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 安全和日志 备份_第5张图片


三,mysql 数据备份


1.备份要点

databases  data 数据

bin-log  记录整个 DML insert  update  delete

my.cnf  配置文件

所有备份数据都应放在 非数据库本地(异地容灾,灾备),而且建议有多分副本

测试环境中做日常恢复演练,恢复较备份更为重要

备份过程中 必须要考虑因素

1.数据的一致性

2.服务的可用性


2.备份方式

物理备份

直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的(innodb)mysql 版本

逻辑备份

备份是建表,建库,插入等操纵所执行SQL 语句(DDL DML DCL) 适用于中小型数据库,效率相对较低


3.备份影响

热备份值得是当数据库进行备份时,数据库的读写操作均不受影响

温备份指的是 当数据库进行备份时,数据库的读操作可以执行,但是不能执行写操作

冷备份指的是当数据库进行备份时,数据库不能进行读写操作,即数据库要下线


4.备份范围的粒度

等级

完全备份   所有数据进行备份

增量备份   新增的数据进行备份

mysql 安全和日志 备份_第6张图片


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 安全和日志 备份_第7张图片

mysql 安全和日志 备份_第8张图片

启动 mysql 并进入 查看

mysql 安全和日志 备份_第9张图片

mysql 安全和日志 备份_第10张图片

数据库 已经恢复了

通过脚本方式 定时备份 并远程传输到指定的备份服务器  实现远程备份(容灾,灾备)

设置 ssh 免密 登录远程 备份服务器  

mysql 安全和日志 备份_第11张图片

执行 查看效果

加入计划任务定时 执行该脚本


6.percona-xtrabackup 备份

percona 

mysql 安全和日志 备份_第12张图片

要使用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/

mysql 安全和日志 备份_第13张图片

 看到如下信息就 完成了

 

模拟恢复

再次drop 掉数据库

mysql 安全和日志 备份_第14张图片

恢复命令

shell > innobackupex --copy-back /xtrabackup/full/2018-05-28_17-40-31

shell > chown -R mysql:mysql /usr/local/mysql/data

注意 执行前要把数据库停掉 而且要把原来的数据文件 备份到别的地方 不然会有下面提示 不能恢复

执行完 看到下面信息说明恢复完成 接下来给权限

mysql 安全和日志 备份_第15张图片

 

启动 服务 查看

mysql 安全和日志 备份_第16张图片

数据库又完全恢复了 


增量备份

注意增量备份仅能应用于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:

mysql 安全和日志 备份_第17张图片

mysqldump 备份脚本

#!/bin/bash
# the script used to backup mysql
# auth: Ren

bakdir=/home/mysqlbackup
filename=zabbix-`date +%F`.sql
bakname=zabiix-`date +%F`.tar.gz

/bin/mysqldump --skip-lock-table -uroot -pwlwx2019 -B zabbix > $bakdir/$filename
/bin/tar zcf $bakdir/$bakname -C $bakdir/ $filename
if [ $? -eq 0 ];then
        /bin/rm -f $bakdir/$filename
fi
/bin/find $bakdir/* -mtime +14 | /bin/xargs rm -f &>/dev/nul

加入计划任务

# crontab -e
0 02 */7 * * /root/dbback.sh

 

你可能感兴趣的:(MySQL)