기사 디렉토리
MySQL 데이터베이스 - 권한 제어 및 로그 관리
1. MySQL 사용자 관리 및 권한 관리
1. DCL(데이터 제어 언어 데이터베이스 제어 언어)
• 데이터베이스 권한 부여 및 역할 제어와 같은 작업
• 사용자에게 액세스 권한을 부여하는 GRANT 사용자 권한 부여
• REVOKE는 승인을 취소하고 승인을 되돌립니다.
2. MySQL 권한 테이블
Mysql 권한은 권한 테이블에 의해 관리되며 다음과 같이 나뉩니다.
2.1, mysql.user
• 사용자 필드: 호스트, 사용자, 비밀번호
• 권한 필드: _priv 후행 필드
• 보안 필드: ssl x509 필드
• 리소스 제어 필드: max_로 시작하는 필드
2.2, mysql.db
• 사용자 필드: 호스트, 사용자, 비밀번호
• 권한 필드: _priv로 끝나는 나머지 필드
2.3、mysql.tables_priv、mysql.columns_priv、procs_priv
• 테이블, 열, 저장 프로시저에 대한 권한 부여 테이블
2.4 권한 수준의 배열
• mysql.user #글로벌 권한 부여
• mysql.db #데이터베이스 수준 권한 부여
• 기타 # 테이블 수준, 열 수준 권한 부여
2.5, 데이터베이스 및 테이블 형식
데이터베이스 및 테이블 형식 | 의미 |
---|---|
데이터 저장 이름.* | 데이터베이스의 모든 것 |
데이터베이스_이름.테이블_이름 | 데이터베이스에서 테이블 지정 |
데이터베이스 이름.저장 프로시저 | 데이터베이스의 저장 프로시저 지정 |
*.* | 모든 데이터베이스 |
2.6 사용자 및 IP 형식
사용자 및 IP 형식 | 의미 |
---|---|
사용자 이름@IP주소 | 사용자는 이 IP로만 액세스할 수 있습니다. |
사용자 이름@192.168.1.% | 사용자는 이 IP 네트워크 세그먼트에서만 액세스할 수 있습니다(와일드카드 %는 모두를 의미) |
사용자 이름@%.xxx.com | 사용자는 .xxx.com 도메인 이름 접미사가 있는 호스트에만 로그인할 수 있습니다. |
사용자 이름@% | 사용자는 모든 IP에서 액세스할 수 있습니다(기본 IP 주소는 %). |
3. MySQL 사용자 관리
3.1 사용자 생성
#create user语句创建
create user '用户名'@'IP地址' identified by '密码';
#例:
create user 'test'@'%' identified by '111';
#grant语句创建
grant select on 数据库和表权限 to '用户名'@'IP地址' identified by "密码";
#例:
grant select on *.* to 'test'@'%' identified by "111";
3.2 사용자 삭제
#drop user语句删除
drop user '用户名'@'IP地址'
#例:
drop user 'user1'@'localhost'
#delete语句删除
delete from mysql.user where user='用户名' and host='IP地址';
#例:
delete from mysql.user where user='test' and host='%';
3.3 사용자 이름 및 IP 주소 수정
rename user '旧用户名'@'IP地址' to '新用户名'@'IP地址';
#例:
rename user 'test'@'localhost' to 'demo'@'localhost';
3.4, 비밀번호 변경
참고: 비밀번호를 수정한 후 권한을 새로 고쳐야 합니다.flush privileges
① 자신의 비밀번호를 변경하기 위한 root 사용자
方法一:命令行输入
mysqladmin -uroot -p原密码 password '新密码'
方法二:数据库中输入
alter user 'root'@'localhost' identified by '新密码';
方法三:数据库中输入
set PASSWORD=password('新密码');
②루트 사용자가 다른 사용자의 비밀번호를 수정하는 경우
都在数据库中输入
方法一:
alter user '用户名'@'IP地址' identified by '新密码';
方法二:
grant select on *.* to '' '用户名'@'IP地址' identified by '新密码';
③일반 사용자가 자신의 비밀번호를 수정하는 경우
数据库中输入:
set password=password('新密码')
3.5 루트 비밀번호 찾기
어느날 루트비밀번호를 잊어버린 경우 루트비밀번호는 어떻게 검색하나요?
♩ Mysql 설정 파일 수정 /etc/my.cnf
#在[mysqld]下面加上skip-grant-tables
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
#设置免密登陆
skip-grant-tables
♪ MySQL 다시 시작
[root@localhost ~]# systemctl restart mysqld
♫ 비밀번호 변경
#终端输入mysql直接登录mysql数据库
[root@localhost ~]# mysql
#切换到mysql系统库
mysql> use mysql;
#设置root密码
mysql> update user set authentication_string=password('新密码') where user='root';
♬ 첫 번째 단계에서 비밀번호 없는 로그인을 주석 처리
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
#skip-grant-tables
마지막으로 mysqld 서비스를 다시 시작합니다.
3.6 비밀번호 복잡성 정책
♪ 비밀번호 플러그인 설치
MySQL에는 기본적으로 암호 복잡성 설정이 활성화되어 있으며 플러그인 이름은 validate_password입니다.
#安装插件
mysql> install plugin validate_password soname 'validate_password.so';
♪ 구성 파일 설치 및 수정
#修改配置文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
…………
plugin-load=validate_password.so #安装插件
validate_password_policy=0(或1或2) #可自行配置规则
validate_password=FORCE_PLUS_PERMANENT
#重启mysql生效
[root@localhost ~]# systemctl restart mysqld
♫ 규칙을 보려면 데이터베이스에 로그인하십시오
mysql> show variables like 'validate%';
필드 의미:
1.validate_password_policy
암호 정책을 나타내며 구성 가능한 값은 다음과 같습니다.
——0 또는 LOW는 비밀번호 길이(파라미터 validate_password_length로 지정)와만 일치하면 됩니다.
——1 또는 MEDIUM은 LOW 정책을 충족하며 최소 1개의 숫자, 소문자, 대문자 및 특수 문자가 필요합니다.
——2 또는 STRONG은 MEDIUM 정책을 충족하며 암호는 사전 파일에 저장할 수 없습니다.
2.validate_password_dictionary_file
비밀번호 설정에 사용되는 사전 파일입니다.validate_password_policy를 STRONG로 설정하면 비밀번호 사전 파일을 설정할 수 있습니다.사전 파일에 있는 비밀번호는 사용하면 안됩니다.
3.validate_password_length
암호의 최소 길이를 설정하는 데 사용되며 기본값은 8이고 최소값은 0입니다.
4.validate_password_mixed_case_count
validate_password_policy가 MEDIUM 또는 STRONG로 설정된 경우 비밀번호의 소문자 및 대문자 수 이상, 기본값은 1이고 최소값은 0입니다. 기본값은 최소 하나의 소문자와 하나의 대문자입니다.
5.validate_password_number_count
validate_password_policy가 MEDIUM 또는 STRONG로 설정된 경우 비밀번호의 최소 자릿수, 기본값은 1이고 최소값은 0입니다.
6.validate_password_special_char_count
validate_password_policy가 MEDIUM 또는 STRONG로 설정되면 비밀번호의 최소 특수 문자 수이며 기본값은 1이고 최소값은 0입니다.
4. 권한 관리
4.1 재활용 권한
데이터베이스에 권한을 추가할 수 있으므로 권한을 회수할 수 있습니다. 명령은 다음과 같습니다.
revoke 权限 on 数据库.数据表 from '用户名'@'IP地址'
• 취소된 권한이 있어야 합니다. 그렇지 않으면 오류가 발생합니다.
• 전체 서버 - grant all
및evoke all;
• 전체 데이터베이스 - 사용on datebases.*;
• 특정 테이블 - 사용on datebase.table;
4.2 새로 고침 권한
mysql> flush privileges;
flush privileges
명령의 본질은 mysql 라이브러리(MySQL 데이터베이스의 내장 라이브러리)에서 현재 사용자 및 권한 테이블의 사용자 정보/권한 설정을 메모리로 추출하는 것입니다.
MySQL 사용자 데이터 및 권한이 수정되고 검색이 MySQL 서비스를 다시 시작하지 않고 직접 적용되기를 원하면 이 명령을 실행해야 합니다.
4.3 보기 권한
show grants for '用户名'@'IP地址';
#可以不指定用户,则显示当前用户权限。
show grants;
4.4 인증 및 비밀번호 설정
#授权及设置密码
grant 权限1[,权限2,权限3...] no 数据库.数据表 to '用户名'@'IP地址';
grant 权限1[,权限2,权限3...] no 数据库.数据表 to '用户名'@'IP地址' identified by '密码';
여러 권한 부여를 단순화하고 쉼표로 구분할 수 있습니다. 권한 부여에는 부여할 권한, 권한이 부여된 데이터베이스 또는 테이블, 사용자 이름과 같은 명시적 정보가 필요합니다.
허가 | 권한 운영 수준 | 권한 설명 |
---|---|---|
만들다 | 라이브러리, 테이블 또는 인덱스 | 라이브러리, 테이블 또는 인덱스 생성 권한 |
하락 | 도서관이나 테이블 | 라이브러리 또는 테이블 권한 삭제 |
부여 옵션 | 라이브러리, 테이블 또는 저장된 프로그램 | 권한 부여 옵션 권한 |
참조 | 도서관이나 테이블 | 외래 키 생성 권한 허용 여부 |
바꾸다 | 표면 | 필드, 인덱스 등을 추가할 수 있는 권한과 같은 테이블 변경 사항 |
삭제 | 표면 | 데이터 권한 삭제 |
인덱스 | 표면 | 색인 권한 |
끼워 넣다 | 표면 | 삽입 권한 |
고르다 | 표면 | 쿼리 권한 |
업데이트 | 표면 | 권한 업데이트 |
보기 만들기 | 보다 | 보기 권한 만들기 |
보기 보기 | 보다 | 보기 권한 보기 |
루틴을 변경 | 저장 프로시저 | 저장 프로시저 권한 변경 |
루틴 만들기 | 저장 프로시저 | 저장 프로시저 권한 만들기 |
실행하다 | 저장 프로시저 | 저장 프로시저 실행 권한 |
파일 | 서버 호스트의 파일 액세스 | 파일 액세스 권한 |
임시 테이블 생성 | 서버 관리 | 임시 테이블 생성 권한 |
잠금 테이블 | 서버 관리 | 테이블 권한 잠금 |
사용자 생성 | 서버 관리 | 사용자 권한 생성 |
재장전 | 서버 관리 | 플러시 호스트, 플러시 로그, 플러시 권한, 플러시 상태, 플러시 테이블, 플러시 스레드, 새로 고침 및 다시 로드와 같은 명령을 실행할 수 있는 권한 |
프로세스 | 서버 관리 | 프로세스 권한 보기 |
복제 클라이언트 | 서버 관리 | 마스터 상태 표시, 슬레이브 상태 표시, 바이너리 로그 표시 명령을 실행할 수 있습니다. |
복제 슬레이브 | 서버 관리 | 마스터-슬레이브 복제 관계를 설정하기 위해 슬레이브 호스트가 이 사용자를 통해 마스터에 연결하도록 허용 |
데이터베이스 표시 | 서버 관리 | 데이터베이스 권한 보기 |
일시 휴업 | 서버 관리 | 데이터베이스 권한 끄기 |
감독자 | 서버 관리 | 킬 스레드 권한 실행 |
권한 분배 | 가능한 설정 권한 |
---|---|
테이블 권한 | '선택', '삽입', '업데이트', '삭제', '만들기', '삭제', '부여', '참조', '색인', '변경' |
열 권한 | '선택', '삽입', '업데이트', '참조' |
프로세스 권한 | 실행','루틴 변경','그랜트' |
2. MySQL 로그 관리
1.Mysql 오류 로그
오류 로그의 역할: MySQL 시작 및 작업 프로세스 동안의 상태, 오류 및 경고를 기록합니다.
오류 로그 설정 :
#配置错误日志,修改配置文件,并重启MySQL
[root@localhost ~]# vim /etc/my.cnf
log_error=/mnt/mysql.log #这里的路径和文件名称可以随便定义
[root@localhost ~]# systemctl restart mysqld
오류 로그 보기 :
mysql> select @@log_error;
+-----------------+
| @@log_error |
+-----------------+
| /mnt/mysql.log |
+-----------------+
1 row in set (0.00 sec)
참고: 오류 로그를 볼 때 [ERROR] 컨텍스트에 초점을 맞춥니다.
2. MySQL 바이너리 로그
바이너리 로그의 역할: 데이터 복구에 필요한 로그, 마스터-슬레이브 복제에 따른 로그
바이너리 로그 설정 :
#修改配置文件
[root@localhost ~]# vim /etc/my.cnf
server_id=1
log_bin=/mnt/binlog/mysql-bin
#server_id是mysql5.7版本之后开二进制日志的必加参数
#log_bin= 打开二进制功能
#/mnt/binlog 为指定存放路径
#mysql-bin 为文件名前缀
#创建目录并授权
[root@localhost ~]# mkdir -p /mnt/binlog/
[root@localhost ~]# chown -R mysql.mysql /mnt/binlog/*
[root@localhost ~]# systemctl restart mysqld
配置说明:
mysql-bin 是在配置文件配置的前缀。
000001 MySQL每次重启,重新生成新的。
二进制日志的内容:
除了查询类的语句,都会记录,即所有数据库变更类的语句。
①记录语句的种类:
• DDL(数据定义语言):create、drop
• DCL(数据控制语言):grant、revoke
• DML(数据操作语言):insert、update、delete
②不同语句的记录格式说明:
• DDL、DCL直接以语句(statement)方式记录
• DML语句有三种模式:SBR、RBR、MBR
模式说明:
• statement——>SBR:做什么记录什么,即SQL语句
• row——>RBR:记录数据行的变化
• mixed——>MBR:自动判断记录模式
• SBR和RBR的区别
区别项 | SBR | RBR |
---|---|---|
记录内容 | SQL语句 | 记录数据行的变化 |
可读性 | 较强 | 差 |
日志量 | 小 | 大 |
日志记录准确性 | 数据误差 | 没有误差 |
#修改二进制日志工作模式
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
binlog_format='MIXED'
#查看二进制日志是否开启
mysql> show variables like '%binlog%';
2.1二进制日志三种模式的区别
2.1.1、ROW:基于行的复制
优点:所有的语句都可以复制,不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。
缺点:binlog大了很多,复杂的回滚时binlog中会包含大量的数据;主服务器上执行update语句时,所有发生变化的记录都会写到binlog中;比如有这样一条update语句update product set owner_member_id='d'where owner_member_id-'a'
执行之后,日志中记录的不是这条update语句所对应的事件(mysql是以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多事件。自然bin-log日志的量会很大。
2.1.2、Statement:基于sql语句的复制
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于它是记录的执行语句,所以为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于mysql现在发展比较快,很多的新功能加入,使mysql的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如sleep()在有些版本就不能正确复制。
2.1.3、mixed模式:row与statement结合
实际上就是前两种模式的结合,在mixed模式下,mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在statement和row之间选一种。新版本中的statement level还是和以前一样,仅仅记录执行的语句。而新版本的mysql中对row level模式被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时侯就会以statement模式来记录,如果sgl语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
2.2二进制日志事件
2.2.1、二进制日志事件简介
• 二进制日志内容以事件(binlog events)为最小记录单元。
• 对于DDL和DCL,一个语句就是一个事件。
• 对于DML(标准的事务语句),只记录已提交的事务的DML语句
begin ; 事件1
a 事件2
b 事件3
commit ; 事件4
2.2.2、事件的构成(为了截取日志)
[root@localhost data]# mysqlbinlog mysql-bin.000001
#at219 事件开始的位置(position)
end_log_pos 319 事件结束的位置(position)
#220811 14:28:12 事件发生的时间
create database aaaaa 事件内容
2.2.3、二进制日志的基础查看
#查看二进制日志的配置信息
mysql> show variables like '%log_bin%';
字段说明:
• log_bin开启二进制日志的开关
• log_bin_basename位置
• sql_log_bin临时开启或关闭二进制日志的小开关
#查看二进制日志的基本信息
mysql> show binary logs;
#查看当前正在使用的二进制日志
mysql> show master status;(常用)
2.3二进制日志内容的查看和截取
#二进制文件不能用vim查看,要用mysqlbinlog命令查看
[root@localhost data]# mysqlbinlog 路径/mysql-bin.000001
#mysql中查看当前记录事务的二进制文件
mysql> show master status;
#查看该文件中的具体事务
mysql> show binlog events in '二进制文件名'
日志截取语法:
• --start-position 开始截取pod点
• --stop-position 结束截取pod点
#截取日志并另存为一个用来恢复的文件
[root@localhost data]# mysqlbinlog --start-position=xxx --stop-position 路径/mysql-bin.00000x > 路径/自定义名字.sql
#恢复
mysql> source 路径/自定义名字.sql
mysql> begin; #开始事务
mysql> commit; #提交事务
2.4基于gtid的二进制日志管理
gtid(Global Transaction ID)简介
• 全局唯一的事务编号。
• 幂等性。
• Gtid包括两部分:Server_uuid和Tx_id。
gtid配置
#查看gtid
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.01 sec)
#修改配置
[root@localhost data]# vim /etc/my.cnf
[msyqld]
gtid_mode=on #开启gtid
enforce_gtid_consistency=true #强制GTID一致性
log_slave_updates=1 #主从复制中从库记求bin1og,并统一GTID信息
#重启数据库生效
[root@localhost data]# systemcat restart mysqld
#此时查看gtid就开启了
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.01 sec)
基于gtid截取日志
• 对于DDL和DCL 一个操作就是一个GTID
• 对于DML 一个完整的事务就是一个GTID
--include-gtids=包含
--exclude-gtids=排除
--skip-gtids=跳过
#如截取1-3号事务
[root@localhost data]# mysqlbinlog --include-gtids='827ddb16-4ec8-11ea-b734-000c293df1f0:1-3'/usr/lcoal/mysql/data/mysql-bin.000003 > /usr/lcoal/mysql/data/gtid.sql
#截取1-10号事务,跳过6号事务
[root@localhost data]# mysqlbinlog --include-gtids='827ddb16-4ec8-1lea-b734-000c293df1f0:1-10 --exc1ude-gtids:='545fd699-be48-11e9-8f0a-000c2980e248:6' /usr/lcoal/mysql/data/mysql-bin.000003>/usr/lcoal/mysql/data/gtid.sql
3.Mysql慢日志
慢日志简介
• 记录运行较慢的语句记录slowlog中。
• 功能是铺助优化的工具日志。
• 应激性的慢可以通过show processlisti进行监控。
• 一段时间的慢可以进行slow记录、统计。
慢日志配置
#查看慢日志是否开启
mysql> show variables like '%slow_query%';
+---------------------+------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/localhost-slow.log |
+---------------------+------------------------------------------+
2 rows in set (0.01 sec)
#此时慢日志是关闭的
#重连或者新开一个会话才能看到修改值
#查看阈值(达到多长时间才能记录慢日志)
mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
| 10.000000 |
+-------------------+
1 row in set (0.00 sec)
#设置阈值为3秒
mysql> set global long_query_time=3;
#修改配置文件,开启慢日志
[root@localhost data]#vim /etc/my.cnf
[mysqld]
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/qfedu-slow.log
1ong-query_time=3 #默认配置10秒
log_queries_not_using_indexes=1
#重启数据库生效
慢日志分析工具
#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /usr/local/mysql/data/test-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /usr/local/mysql/data/test-slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "LEFT JOIN"
/usr/local/mysql/data/test-s1ow.1og
#结合|more使用,防止爆屏情况
mysqldumpslow -s r -t 10/usr/local/mysql/data/test-slow.log | more
#选项含义
s:表示按何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t:返回前面多少条的数据
g:后边搭配一个正则匹配模式,大小写不敏感
--help查看帮助
END