MySQL アカウント情報をエレガントにバックアップする方法

MySQL アカウント情報をエレガントにバックアップする方法

序文:

最近、インスタンスの移行の問題に遭遇しました。データの移行後、データベースのユーザーと権限も移行する必要がありました。論理バックアップを実行するときは通常、バックアップにデータベース ユーザーに関連する情報が含まれないように、MySQL システム ライブラリを除外します。現時点では、ユーザー関連情報を移行する場合は、次の 3 つのソリューションを使用できます。同様に、データベース アカウント関連情報をバックアップする場合も、次の 3 つのソリューションを使用できます。 (このソリューションは MySQL 5.7 用であり、他のバージョンでは若干異なります)

1.mysqldumpはユーザー関連情報を論理的にエクスポートします

データベース ユーザーのパスワードと権限関連の情報は、システム ライブラリ mysql に保存されていることがわかっています。 mysqldump を使用して関連するテーブル データをエクスポートします。ユーザーを移行する必要がある場合は、必要に応じてこのデータを別のインスタンスに挿入できます。これを実証してみましょう:

#mysql データベースの user、db、tables_priv テーブルのみをエクスポートします。#列の権限がある場合は、columns_priv テーブル データをエクスポートできます。#データベースで GTID が有効になっている場合は、エクスポート時に --set-gtid-purged=OFF を追加するのが最適です。
mysqldump -uroot -proot mysql ユーザー db tables_priv -t --skip-extended-insert > /tmp/user_info.sql

#エクスポート固有の情報--
-- テーブル `user` のデータをダンプしています
--

LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` でキーを無効にする */;
`user` に値を挿入します ('%','root','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',''、''、'_binary ''、_binary ''、0、0、0、0、'mysql_native_password'、'*
81F5E21E35407D884A6CD4A731AEBFB6AF209E1B','N','2019-03-06 03:03:15',NULL,'N');
`user` に INSERT INTO VALUES ('localhost','mysql.session','N','N','N','N','N','N','N','N','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',''、_binary ''、_binary ''、0、0、0、0、'mysql_na
tive_password','*これはここで使用できる有効なパスワードではありません','N','2019-03-06 02:57:40',NULL,'Y');
`user` に INSERT INTO VALUES ('localhost','mysql.sys','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',''_binary '',_binary '',0,0,0,0,'mysql_native
_password','*これはここで使用できる有効なパスワードではありません','N','2019-03-06 02:57:40',NULL,'Y');
`user` に値を挿入します ('%'、'test'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、''、_binary ''、_binary ''、0、0、0、0、'mysql_native_password'、'*'
94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29','N','2019-04-19 06:24:54',NULL,'N');
`user` に値を挿入します ('%'、'read'、'Y'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、''、'_binary ''、_binary ''、0、0、0、0、'mysql_native_password'、'*'
2158DEFBE7B6FC24585930DF63794A2A44F22736','N','2019-04-19 06:27:45',NULL,'N');
`user` に値を挿入します ('%'、'test_user'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、''、'_binary ''、_binary ''、0、0、0、0、'mysql_native_password
d','*8A447777509932F0ED07ADB033562027D95A0F17','N','2019-04-19 06:29:38',NULL,'N');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
テーブルのロックを解除します。

--
-- テーブル `db` のデータをダンプしています
--

LOCK TABLES `db` WRITE;
/*!40000 ALTER TABLE `db` でキーを無効にする */;
`db` に値を挿入します ('localhost'、'performance_schema'、'mysql.session'、'Y'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N');
`db` に値 ('localhost'、'sys'、'mysql.sys'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'N'、'Y') を挿入します。
`db` に値を挿入します ('%'、'test_db'、'test'、'Y'、'Y'、'Y'、'Y'、'N'、'N'、'Y'、'N'、'Y'、'N'、'Y'、'Y'、'N'、'Y'、'N'、'Y'、'N'、'N'、'Y'、'N'、'N'、'Y'、'N'、'N');
/*!40000 ALTER TABLE `db` ENABLE KEYS */;
テーブルのロックを解除します。

--
-- テーブル `tables_priv` のデータをダンプしています
--

LOCK TABLES `tables_priv` WRITE;
/*!40000 ALTER TABLE `tables_priv` でキーを無効にする */;
`tables_priv` に値 ('localhost'、'mysql'、'mysql.session'、'user'、'boot@connecting host'、'0000-00-00 00:00:00'、'Select'、'') を挿入します。
`tables_priv` に値 ('localhost'、'sys'、'mysql.sys'、'sys_config'、'root@localhost'、'2019-03-06 02:57:40'、'Select'、'') を挿入します。
`tables_priv` に値を挿入します ('%'、'test_db'、'test_user'、't1'、'root@localhost'、'0000-00-00 00:00:00'、'Select、Insert、Update、Delete'、'');
/*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */;
テーブルのロックを解除します。

#新しいインスタンスに必要なデータを挿入して、同じユーザーと権限を作成します

2. カスタムスクリプトのエクスポート

まず、ステートメントを連結してユーザーを作成します。

選択
	連結(
		'ユーザーを作成 \'',
  ユーザー、
  '\'@\''、
  ホスト、
  '\''
  ' パスワードで識別 \'',
  認証文字列、
		'\';'
	) AS CreateUserQuery
から
	mysql.`ユーザー`
どこ
	`User` が ( にありません
		'mysql.セッション',
		'mysql.sys'
	);
	
#結果: 新しいインスタンスで実行すると、同じパスワードを持つユーザーを作成できます。mysql> SELECT
  -> 連結(
  -> 'ユーザーを作成 \'',
  -> ユーザー、
  -> '\'@\''、
  -> ホスト、
  -> '\''
  -> ' パスワードで識別 \'',
  -> 認証文字列、
  -> '\';'
  -> ) AS CreateUserQuery
  -> から
  -> mysql.`ユーザー`
  -> どこ
  -> `User` が存在しません (
  -> 'mysql.session',
  -> 'mysql.sys'
  -> );
+---------------------------------------------------------------------------------------------------------------------------------+
| ユーザークエリの作成 |
+---------------------------------------------------------------------------------------------------------------------------------+
| ユーザー 'root'@'%' を作成します (パスワード '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' で識別されます)。|
| ユーザー 'test'@'%' を作成します (パスワード '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' で識別されます)。|
| ユーザー 'read'@'%' を作成します (パスワード '*2158DEFBE7B6FC24585930DF63794A2A44F22736' で識別されます)。|
| ユーザー 'test_user'@'%' を作成します。パスワード '*8A447777509932F0ED07ADB033562027D95A0F17' で識別されます。|
+---------------------------------------------------------------------------------------------------------------------------------+
セット内の 4 行 (0.00 秒)

次に、スクリプトを使用してユーザー権限をエクスポートします。

#権限スクリプトのエクスポート#!/bin/bash 
#関数ユーザー権限のエクスポート 
 
パスワード=ルート 
外国人移住者() 
{ 
 mysql -B -u'root' -p${pwd} -N $@ -e "SELECT CONCAT( 'SHOW GRANTS FOR ''', user, '''@'''', host, ''';' ) AS query FROM mysql.user" | \
 mysql -u'root' -p${pwd} $@ | \
 sed 's/\(GRANT .*\)/\1;/;s/^\(.*\ の許可)/-- \1 /;/--/{x;p;x;}' 
} 
 
expgrants > /tmp/grants.sql
echo "権限をフラッシュします。" >> /tmp/grants.sql

#スクリプトを実行した後の結果-- read@% の許可 
*.* に対して 'read'@'%' の SELECT 権限を付与します。

-- root@% への権限付与 
GRANT オプション付きで、*.* のすべての権限を 'root'@'%' に付与します。

-- テストの許可@% 
*.* の使用権限を 'test'@'%' に付与します。
`test_db`.* に対して SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、EXECUTE、CREATE VIEW、SHOW VIEW 権限を 'test'@'%' に付与します。

-- test_user@% への許可 
*.* の使用権限を 'test_user'@'%' に付与します。
`test_db`.`t1` に対する SELECT、INSERT、UPDATE、DELETE 権限を 'test_user'@'%' に付与します。

-- mysql.session@localhost への許可 
'mysql.session'@'localhost' に *.* の SUPER 権限を付与します。
'mysql.session'@'localhost' に `performance_schema`.* の SELECT 権限を付与します。
`mysql`.`user` に対する 'mysql.session'@'localhost' への SELECT 権限を付与します。

-- mysql.sys@localhost への許可 
*.* の使用権限を 'mysql.sys'@'localhost' に付与します。
`sys`.* のトリガーを 'mysql.sys'@'localhost' に付与します。
`sys`.`sys_config` に対する 'mysql.sys'@'localhost' への SELECT 権限を付与します。

3.mysqlpumpはユーザーを直接エクスポートします

mysqlpump は mysqldump の派生であり、MySQL 論理バックアップ用のツールでもあります。 mysqlpump にはさらに多くのオプションが用意されており、ユーザーの作成や権限の付与のためのステートメントを直接エクスポートできます。これを実証してみましょう:

#exclude-databases はデータベースを除外します --users はエクスポートするユーザーを指定します exclude-users は除外するユーザーを指定します #--add-drop-user パラメータを追加して、drop user ステートメントを生成することもできます #データベースで GTID が有効になっている場合は、エクスポート時に --set-gtid-purged=OFF を追加する必要があります
mysqlpump -uroot -proot --exclude-databases=% --users --exclude-users=mysql.session,mysql.sys > /tmp/user.sql

#エクスポート結果 - MySQL ポンプ ユーティリティによって作成されたダンプ、バージョン: 5.7.23、linux-glibc2.12 (x86_64)
-- ダンプ開始時間: 2019 年 4 月 19 日金曜日 15:03:02
-- サーバーバージョン: 5.7.23

@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS、UNIQUE_CHECKS=0 に設定します。
@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS、FOREIGN_KEY_CHECKS=0 を設定します。
@OLD_SQL_MODE を @@SQL_MODE に設定します。
SQL_MODE を「NO_AUTO_VALUE_ON_ZERO」に設定します。
@@SESSION.SQL_LOG_BIN= 0 を設定します。
@OLD_TIME_ZONE=@@TIME_ZONE を設定します。
TIME_ZONE='+00:00' を設定します。
@OLD_CHARACTER_SET_CLIENT を @@CHARACTER_SET_CLIENT に設定します。
@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS を設定します。
@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION を設定します。
名前を設定します utf8mb4;
CREATE USER 'read'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2158DEFBE7B6FC24585930DF63794A2A44F22736' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
*.* に対して 'read'@'%' の SELECT 権限を付与します。
CREATE USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
GRANT オプション付きで、*.* のすべての権限を 'root'@'%' に付与します。
CREATE USER 'test'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
*.* の使用権限を 'test'@'%' に付与します。
`test_db`.* に対して SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、EXECUTE、CREATE VIEW、SHOW VIEW 権限を 'test'@'%' に付与します。
CREATE USER 'test_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*8A447777509932F0ED07ADB033562027D95A0F17' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
*.* の使用権限を 'test_user'@'%' に付与します。
`test_db`.`t1` に対する SELECT、INSERT、UPDATE、DELETE 権限を 'test_user'@'%' に付与します。
TIME_ZONE を @OLD_TIME_ZONE に設定します。
CHARACTER_SET_CLIENT を @OLD_CHARACTER_SET_CLIENT に設定します。
CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS を設定します。
COLLATION_CONNECTION を @OLD_COLLATION_CONNECTION に設定します。
FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS を設定します。
UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS を設定します。
SQL_MODE を @OLD_SQL_MODE に設定します。
-- ダンプ終了時間: 2019 年 4 月 19 日金曜日 15:03:02

#エクスポート結果には、ユーザーの作成と権限の付与に関するステートメントのみが含まれていることがわかります。これは非常に便利です。#mysqlpump の詳細な使用方法については、以下を参照してください。
https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html

要約:

この記事では、データベース ユーザー情報をエクスポートするための 3 つのソリューションを紹介します。各ソリューションにはスクリプトが用意されており、そのデモも行われます。同時に、これら 3 つのソリューションを少しカプセル化して、データベース ユーザー権限をバックアップするためのスクリプトとして使用することもできます。おそらく、pt-show-grants などの他のソリューションがあるでしょう。ぜひ共有してください。また、それらを収集したり、より適切なスクリプトに変更したりすることもできます。いつ必要になるかはわかりません。特に、インスタンスに多くのユーザーが存在する場合は、スクリプトの方が便利であることがわかります。

上記は、MySQL アカウントをエレガントにバックアップする方法に関する詳細情報です。MySQL バックアップ アカウントの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL バックアップ スクリプトの書き方
  • MySQLのバックアップとリカバリの簡単な分析
  • MySQLのバックアップとリカバリの詳細な説明
  • MySQL スケジュール バックアップ ソリューション (Linux crontab を使用)
  • MySQL スケジュールバックアップタスクの簡単な分析
  • Linux サーバーのスクリプトを自動的にバックアップする方法 (mysql、添付ファイルのバックアップ)
  • Linux は定期的に MySQL データベースをバックアップし、以前のバックアップ ファイルを削除します (推奨)
  • CentOS7 で MySQL のスケジュールされた自動バックアップを実装する方法
  • Mysql 複数データベースのバックアップ コード例

<<:  UbuntuにCMakeをインストールするいくつかの方法の詳細な説明

>>:  JS でタブ効果を書く

推薦する

JavaScript で 9 グリッドのモバイル パズル ゲームを実装

この記事では、Jiugonggeモバイルパズルゲームを実装するためのJavaScriptの具体的なコ...

Dockerにおけるオーバーレイネットワークの詳細な説明

Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/n...

React Router V6 のアップデート

目次ReactRouterV6 の変更1. <Switch> が <Routes&...

react+antd.3x は IP 入力ボックスを実装します

この記事では、IP入力ボックスを実装するための react+antd.3x の具体的なコードを参考ま...

Vue はカスタム「モーダル ポップアップ ウィンドウ」コンポーネントのサンプル コードを実装します

目次序文レンダリングサンプルコード要約する序文ダイアログ ボックスは非常に一般的なコンポーネントであ...

Tomcat の一般的な例外と解決コードの例

弊社のプロジェクトは Java で開発され、ミドルウェアは Tomcat でした。運用中に、Tomc...

React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)

最近、古い RN プロジェクトを Xcode で実行すると、次のコード エラーが報告されました。 &...

Vueはファイルのアップロードとダウンロード機能を実装します

この記事では、ファイルのアップロードとダウンロード機能を実装するためのVueの具体的なコードを例とし...

ESXI の仮想マシンにワークステーションをインストールするときに発生するネットワーク障害の解決策

問題の説明ESXI で Windows にワークステーションをインストールした後、内部の仮想マシンは...

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...

CentOS7で新しいデータディスクをマウントするための完全な手順

序文新しい VPS を購入しました。新しい VPS のデータ ディスクはデフォルトではシステムにマウ...

IISMonitor を使用して Web ページを監視し、IIS を自動的に再起動します。

目次1. ツールの紹介2. ワークフロー3. 操作インターフェースとパラメータ設定(1)監視と再起動...

Docker で MySQL をインストールし、リモート接続を実装するチュートリアル

画像をプルする docker プル mysql完成した画像を見る Docker イメージイメージを介...