記事ディレクトリ
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('新密码');
②rootユーザーが他のユーザーのパスワードを変更する
都在数据库中输入
方法一:
alter user '用户名'@'IP地址' identified by '新密码';
方法二:
grant select on *.* to '' '用户名'@'IP地址' identified by '新密码';
③一般ユーザーが自分のパスワードを変更
数据库中输入:
set password=password('新密码')
3.5. root パスワードの取得
ある日、root パスワードを忘れた場合、root パスワードを取得するにはどうすればよいですか?
♩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 です。デフォルトは、少なくとも 1 つの小文字と 1 つの大文字です。
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 '密码';
複数の認証は簡略化してコンマで区切ることができます。Grant には、付与される権限、権限が付与されるデータベースまたはテーブル、ユーザー名などの明示的な情報が必要です。
許可 | 許可操作レベル | 権限の説明 |
---|---|---|
作成 | ライブラリ、テーブル、またはインデックス | ライブラリ、テーブル、またはインデックスの作成権限 |
落とす | ライブラリまたはテーブル | ライブラリまたはテーブルの権限を削除する |
付与オプション | ライブラリ、テーブル、または保存されたプログラム | パーミッション オプション パーミッションを付与する |
参考文献 | ライブラリまたはテーブル | 外部キー作成パーミッションを許可するかどうか |
変更する | 水面 | フィールドやインデックスなどを追加する権限など、テーブルへの変更。 |
消去 | 水面 | データ権限の削除 |
索引 | 水面 | インデックスの権限 |
入れる | 水面 | 許可を挿入 |
選択する | 水面 | クエリ権限 |
アップデート | 水面 | 権限の更新 |
ビューを作成 | 見る | ビュー権限の作成 |
ビューを表示 | 見る | 表示権限の表示 |
ルーチンを変更する | ストアド プロシージャ | ストアド プロシージャのアクセス許可を変更する |
ルーチンを作成する | ストアド プロシージャ | ストアド プロシージャのアクセス許可を作成する |
実行する | ストアド プロシージャ | ストアド プロシージャの実行権限 |
ファイル | サーバーホストでのファイルアクセス | ファイル アクセス許可 |
一時テーブルを作成 | サーバー管理 | 一時テーブルの作成権限 |
ロックテーブル | サーバー管理 | テーブルのパーミッションをロックする |
ユーザーを作成 | サーバー管理 | ユーザー権限の作成 |
リロード | サーバー管理 | flush-hosts、flush-logs、flush-privileges、flush-status、flush-tables、flush-threads、refresh、reload などのコマンドを実行する権限 |
処理する | サーバー管理 | プロセスのアクセス許可を表示する |
複製クライアント | サーバー管理 | マスター ステータスの表示、スレーブ ステータスの表示、バイナリ ログの表示コマンドを実行できます。 |
複製スレーブ | サーバー管理 | マスターとスレーブのレプリケーション関係を確立するために、スレーブ ホストがこのユーザーを介してマスターに接続できるようにします |
データベースを表示 | サーバー管理 | データベースの権限を表示する |
シャットダウン | サーバー管理 | データベース権限をオフにする |
素晴らしい | サーバー管理 | kill スレッド許可を実行する |
権限の配布 | 可能な設定権限 |
---|---|
テーブルのパーミッション | Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter' |
列の権限 | 「選択」、「挿入」、「更新」、「参照」 |
プロセス権限 | Execute','Alter Routine','Grant' |
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