MySQL5.7 と MariaDB10.1 監査プラグインの互換性検証

これは、MariaDB 監査プラグインが MySQL のクラッシュを引き起こすことを発見した後の、適応の検証とトラブルシューティングに関する記事です。

著者: 関永強

Acson DBA チームのメンバーで、MySQL の運用および保守スキルに優れています。新しい知識を学ぶのが大好きで、ゲームも大好きなオタクです。

この記事の出典: 元の寄稿

  • Aikesheng オープンソース コミュニティによって作成されており、オリジナルのコンテンツを許可なく使用することはできません。転載する場合は編集者に連絡し、出典を明示してください。

背景

CentOS Linux リリース 7.5.1804 (Core) 仮想マシンを使用して MySQL5.7.34 の MariaDB 監査プラグインをインストールする場合、mariadb-10.1.48-linux-glibc_ 214-x86_64 を解凍して得られたものを使用すると、 .tar.gz、MySQL はserver_audit.soクラッシュの場合、手動で MySQL を再起動してもすぐにクラッシュが発生します。このことから、私は次のように考えずにはいられません。

  1. 他のバージョンの監査プラグインには、このバージョンの MySQL との互換性の問題がありますか?
  2. MySQL の他のバージョンもこのバージョンの監査プラグインを使用できませんか?
  3. このような状況に対する適切な回避策はありますか?

公式 Web サイトの情報によると、MySQL 5.7 は MariaDB 10.1 監査プラグインと互換性があるため、互換性の検証には MySQL 5.7 の一部のバージョンと MariaDB 10.1 の一部のバージョンが選択されています。

ソースコードを変更する前の適応

マリアDB10.1.34 マリアDB10.1.34 マリアDB10.1.41 マリアDB10.1.48
サーバー監査.so 1.4.0 1.4.4 1.4.7 1.4.7
MySQL5.7.39 × × × ×
MySQL5.7.34 × × × ×
MySQL5.7.33

ソースコード変更後の適応

マリアDB10.1.34 マリアDB10.1.34 マリアDB10.1.41 マリアDB10.1.48
サーバー監査.so 1.4.0 1.4.4 1.4.7 1.4.7
MySQL5.7.39
MySQL5.7.34
MySQL5.7.33

検証プロセス

  1. MySQL の 3 つのバージョンをインストールします (プロセスは省略します)。
  2. 公式 Web サイトから 4 つのバージョンの MariaDB インストール パッケージを入手します。
  3. インストール パッケージを解凍して入手しますserver_audit.so
  4. MySQL の監査プラグインをインストールし、可用性を確認します。
# 安装插件示例
# 获取 MariaDB 安装包
https://mariadb.org/download/

# 上传并解压安装包
[root@10-186-60-13 10.1.11]# tar -zxvf mariadb-10.1.11-linux-glibc_214-x86_64
[root@10-186-60-13 10.1.11]# ll
total 509368
drwxr-xr-x 33 1001 1001      4096 Jan 28  2016 mariadb-10.1.11
drwxrwxr-x 13 1021 1004       321 Jan 29  2016 mariadb-10.1.11-linux-glibc_214-x86_64
-rw-r--r--  1 root root 466400911 Jul 19 09:58 mariadb-10.1.11-linux-glibc_214-x86_64.tar.gz
-rw-r--r--  1 root root  55184229 Jul 19 09:57 mariadb-10.1.11.tar.gz

# 获取 server_audit.so
[root@10-186-60-13 10.1.11]# cd mariadb-10.1.11-linux-glibc_214-x86_64/lib/plugin/

# 复制该插件到 MySQL 的 plugin 目录下并修改权限
[root@10-186-60-13 plugin]# cp server_audit.so /data/mysql/base/5.7.33/lib/plugin/
[root@10-186-60-13 plugin]# cd /data/mysql/base/5.7.33/lib/plugin/
[root@10-186-60-13 plugin]# chmod 755 server_audit.so

# 登录到 MySQL 客户端进行插件的安装
[root@10-186-60-13 plugin]# /data/mysql/base/5.7.33/bin/mysql -uroot -p -S /data/mysql/data/3306/mysqld.sock
mysql> install plugin server_audit SONAME 'server_audit.so';
Query OK, 0 rows affected (0.01 sec)

# 检查是否安装成功,若不兼容此时 MySQL 会发生 Crash
mysql> show plugins; 
| SERVER_AUDIT  | ACTIVE   | AUDIT | server_audit.so    | GPL
mysql> show plugins;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/data/3308/mysqld.sock' (111)
ERROR: 
Can't connect to the server

# 查看审计插件情况,开启审计插件,刷新审计插件 log 文件,验证插件可用性
mysql> show variables like'%audit%'; 
mysql> set global server_audit_logging=on;
mysql> set global server_audit_file_rotate_now =on;
Query OK, 0 rows affected (0.00 sec)

# 检查 data 下是否有审计日志文件输出
[root@10-186-60-13 ~]# cd /data/mysql/data/3306/
[root@10-186-60-13 3306]# ll  # 观察到有 server_audit.log 文件输出则插件开启成功
-rw-r----- 1 actiontech-mysql    actiontech-mysql      53236 Jul 19 11:10 server_audit.log
-rw-r----- 1 actiontech-mysql    actiontech-mysql      79363 Jul 19 11:10 server_audit.log.1

# 卸载该审计插件,进行其他版本适配验证
mysql> uninstall plugin server_audit;

# 检查插件可用状态,为 DELETED 则是卸载成功
mysql> show plugins;
| SERVER_AUDIT | DELETED  | AUDIT   | server_audit.so  | GPL


# 通过刷新审计日志验证是否卸载成功
mysql> set global server_audit_file_rotate_now =on;
ERROR 1193 (HY000): Unknown system variable 'server_audit_file_rotate_now'
[root@10-186-60-13 ~]# cd /data/mysql/base/5.7.33/lib/plugin/  

# 删除审计插件,清理 log 文件,重启 MySQL
[root@10-186-60-13 plugin]# rm -rf server_audit.so
[root@10-186-60-13 3306]# rm -rf server_audit.log
[root@10-186-60-13 plugin]# systemctl restart mysqld_3306

注: プラグインの各バージョンの互換性を確認するには、上記の手順を参照してください。ここでは繰り返しません。

クラッシュが発生しました

# 安装审计插件
mysql> install plugin server_audit SONAME 'server_audit.so';
ERROR 2013 (HY000): Lost connection to MySQL server during query

# 检查插件安装情况
mysql>  show plugins;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/data/3308/mysqld.sock' (111)
ERROR: 
Can't connect to the server

# 检查错误日志,发现发生了 Crash
Version: '5.7.39-log'  socket: '/data/mysql/data/3308/mysqld.sock'  port: 3308  MySQL Community Server (GPL)
230719 13:37:36 server_audit: MariaDB Audit Plugin version 1.4.7 STARTED.
05:37:36 UTC - mysqld got signal 11 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
Attempting to collect some information that could help diagnose the problem.
As this is a crash and something is definitely wrong, the information
collection process might fail.
key_buffer_size=16777216
read_buffer_size=8388608
max_used_connections=23
max_threads=2000
thread_count=17
connection_count=17
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 20523165 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
Thread pointer: 0x7fcf7469d380
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7fcfd411fe68 thread_stack 0x40000
/data/mysql/base/5.7.39/bin/mysqld(my_print_stacktrace+0x35)[0xf80e15]
/data/mysql/base/5.7.39/bin/mysqld(handle_fatal_signal+0x4b9)[0x7ff999]
/lib64/libpthread.so.0(+0xf6d0)[0x7fd0394ff6d0]
/data/mysql/base/5.7.39/lib/plugin/server_audit.so(get_db_mysql57+0x2f)[0x7fcfe32b852f]
/data/mysql/base/5.7.39/lib/plugin/server_audit.so(+0xb63b)[0x7fcfe32b863b]
/data/mysql/base/5.7.39/bin/mysqld(_Z18mysql_audit_notifyP3THD30mysql_event_general_subclass_tPKciS3_m+0x2f1)[0x801ff1]
/data/mysql/base/5.7.39/bin/mysqld(my_message_sql+0x134)[0x7f1be4]
/data/mysql/base/5.7.39/bin/mysqld(my_error+0xe0)[0xf7bc30]
/data/mysql/base/5.7.39/bin/mysqld(_ZN7handler11print_errorEii+0x641)[0x851c11]
/data/mysql/base/5.7.39/bin/mysqld[0xd66950]
/data/mysql/base/5.7.39/bin/mysqld(_ZN22Sql_cmd_install_plugin7executeEP3THD+0x23)[0xd66a53]
/data/mysql/base/5.7.39/bin/mysqld(_Z21mysql_execute_commandP3THDb+0xe50)[0xd41750]
/data/mysql/base/5.7.39/bin/mysqld(_Z11mysql_parseP3THDP12Parser_state+0x3cd)[0xd45c7d]
/data/mysql/base/5.7.39/bin/mysqld(_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command+0x1780)[0xd474a0]
/data/mysql/base/5.7.39/bin/mysqld(_Z10do_commandP3THD+0x194)[0xd48064]
/data/mysql/base/5.7.39/bin/mysqld(handle_connection+0x2ac)[0xe1b58c]
/data/mysql/base/5.7.39/bin/mysqld(pfs_spawn_thread+0x174)[0x143c5a4]
/lib64/libpthread.so.0(+0x7e25)[0x7fd0394f7e25]
/lib64/libc.so.6(clone+0x6d)[0x7fd037fb1bad]
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (7fcf74be91a0): install plugin server_audit SONAME 'server_audit.so'
Connection ID (thread ID): 300
Status: NOT_KILLED
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.

解決

  1. クラッシュが発生したら、まず MySQL サービスを復元します。
  2. MariaDB ビルド パッケージを取得します。
  3. MariaDB ソース コードをコンパイルしてインストールする
  4. コンパイルしたものを入手しserver_audit.soて再インストールする
# 发生 Crush 后先删除插件
[root@10-186-60-13 plugin]# rm -rf server_audit.so

# 重启 MySQL 服务并进行登录验证
[root@10-186-60-13 plugin]# systemctl restart mysqld_3308
[root@10-186-60-13 plugin]# /data/mysql/base/5.7.39/bin/mysql -uroot -p -S /data/mysql/data/3308/mysqld.sock

MariaDB コンパイル パッケージを入手する

# 解压安装包
[root@10-186-60-13 mariadb-10.1.48]# yum install -y openssl libssl-dev build-essential bison libncurses-dev cmake gcc-gcc+ git ncurses-devel   

# 安装编译所需依赖
[root@10-186-60-13 10.1.48]# tar -zxvf mariadb-10.1.48.tar.gz
[root@10-186-60-13 10.1.48]# cd mariadb-10.1.48/plugin/server_audit/   
[root@10-186-60-13 server_audit]# vim server_audit.c  

server_audit.c ファイル内の関連コードを変更します。

# 打开 server_audit.c 文件
db_off= 536;     // 将 536 修改为 544,其他不变
db_len_off= 544; // 将 544 修改为 552,其他不变

次に、保存して終了します。

# 返回源文件根目录进行编译安装
[root@10-186-60-13 server_audit]# cd ../..  
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

# 执行 make 进行编译安装
[root@10-186-60-13 server_audit]# make

注: コンパイルが完了したら、プラグインを再インストールするだけなので、ここでは繰り返しません。

コンパイル後のインストールエラー

ソースコードを変更した後にコンパイルおよびインストールすると、エラーが報告されます。

# MariaDB 10.1.41,插件版本为 1.4.7
mysql> install plugin server_audit SONAME 'server_audit.so';
ERROR 1030 (HY000): Got error 1 from storage engine

この時点で確認するmysql-error.logと、該当するエラー メッセージが出力されていないことがわかります。

解決

テストの結果、MySQL を再起動することでこの問題を解決できることがわかりました。再起動後、MySQL は自動的にプラグインをインストールし、プラグインを有効にします。

要約する

監査プラグインが MySQL 5.7.34 と互換性がない理由をたどると、実際には、 MariaDB 監査プラグイン#ifdef __x86_64__db_offと の文字長の定義がdb_len_offMySQL と一致しないためで、プラグインがインストールされているときにMySQL ではクラッシュが発生します MariaDB を修正することでこの問題は監査プラグインのソースコードをコンパイルしてインストールすることで解決できます。

MariaDB と MySQL は正式に機能的に適合されていないため、MySQL が異なるバージョンの監査プラグインをインストールするときにクラッシュを引き起こす他の問題が発生する可能性があります。上記の方法は、このバージョンのインストール中にクラッシュが発生するシナリオのみを対象としています。

このプラグインを使用する場合は、最新バージョンの MariaDB 10.2.X および MariaDB 10.3.X を使用して監査プラグインを入手することをお勧めします。

また、監査プラグインは MySQL と互換性がないため、運用環境で使用する必要がある場合は、損失を避けるために最初にバージョンの適応を確認してください。

さらに技術的な記事については、https: //opensource.actionsky.com/をご覧ください。

SQLEについて

Akson オープン ソース コミュニティの SQLE は、データベース ユーザーおよび管理者向けの SQL 監査ツールです。これは、マルチシナリオ監査をサポートし、標準化されたオンライン プロセスをサポートし、MySQL 監査をネイティブにサポートし、スケーラブルなデータベース タイプを備えています。

SQL取得

タイプ 住所
リポジトリ https://github.com/actiontech/sqle
書類 https://actiontech.github.io/sqle-docs/
リリースニュース https://github.com/actiontech/sqle/releases
データ監査プラグイン開発ドキュメント https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

おすすめ

転載: blog.csdn.net/ActionTech/article/details/131942759