最近、インスタンスの移行の問題が発生しましたが、データの移行後、データベースのユーザーと権限を移行する必要があります。論理バックアップを実行するとき、データベースのユーザー関連情報がバックアップに含まれないように、通常はMySQLシステムライブラリを除外します。現時点では、ユーザー関連情報を移行する場合は、次の3つのソリューションを使用できます。同様に、次の3つのソリューションを使用して、データベースアカウント関連情報をバックアップすることもできます。(この記事の解決策はMySQL 5.7バージョン用で、他のバージョンは少し異なります) |
1. mysqldumpロジックはユーザー関連情報をエクスポートします
データベースユーザーのパスワードと権限に関連する情報がシステムライブラリmysqlに格納されていることはわかっています。mysqldumpを使用して、関連するテーブルデータをエクスポートします。ユーザーを移行する必要がある場合は、必要に応じてこれらのデータを別のインスタンスに挿入できます。以下で説明しましょう:
#mysqlライブラリのユーザー、db、tables_privテーブルデータのみ をエクスポートする#needleチーム列の 権限がある場合、columns_privテーブルデータをエクスポートできます#データベースでGTIDエクスポートが有効になっている場合は、-set-gtid-purged =を追加することをお勧めしますOFF mysqldumpを-uroot -proot MySQLのユーザDB tables_privテーブル-t --skip拡張インサート> /tmp/user_info.sql #Exported 特定情報 - -テーブル`user`のデータをダンプ - ロックテーブル` user` WRITE ; / *!40000 ALTER TABLE `user` DISABLE KEYS * /; INSERT INTO` user` VALUES( '%'、 '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 '、''、_binary ''、_binary ''、_binary ''、0,0,0,0、 'mysql_native_password'、 '*''、_binary ''、_binary ''、_binary ''、0,0,0,0、 'mysql_native_password'、 '* 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B'、 'N'、 '2019-03-06 03:03:15'、NULL 、 'N'); INSERT INTO `user` VALUES( 'localhost'、 'mysql.session'、 'N'、 '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'、 ''、_ binary ''、_binary ''、_binary ''、0、 0,0,0、 'mysql_na tive_password'、 '* THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE'、 'N'、 '2019-03-06 02:57:40'、NULL、 'Y'); INSERT INTO `user` VALUES( 'localhost'、 'mysql.sys'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 ' N '、' N '、 INSERT INTO `user` VALUES( '%'、 '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 '、' '、_ binary' '、_binary' '、_binary' '、0,0、 0,0、 'mysql_native_password'、 '* 94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'、 'N'、 '2019-04-19 06:24:54'、NULL、 'N'); INSERT INTO `user` VALUES( '%'、 'read'、 'Y'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N' 、 'N'、 'N'、 'N'、 ' INSERT INTO `user` VALUES( '%'、 '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 '、' '、_ binary' '、_binary' '、_binary' '、0,0、 0,0、 'mysql_native_passwor 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` DISABLE KEYS * /; INSERT INTO `db` VALUES( 'localhost'、 'performance_schema'、 'mysql.session'、 'Y'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 ' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '); INSERT INTO `db` VALUES( 'localhost'、 'sys'、 'mysql.sys'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 'N'、 ' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' N '、' Y '); INSERT INTO `db` VALUES( '%'、 'test_db'、 'test'、 'Y'、 'Y'、 'Y'、 'Y'、 'Y'、 'Y'、 'N'、 'N' 、 'N'、 'Y'、 'N'、 'N'、 'Y'、 'Y'、 'N'、 'N'、 'Y'、 'N'、 'N'); / *!40000 ALTER TABLE `db` ENABLE KEYS * /; テーブルのロックを解除します。 - -表`tables_priv`のデータをダンプ - ロックテーブル` tables_priv`書き込み; / *!40000 ALTER TABLE `tables_priv` DISABLE KEYS * /; INSERT INTO `tables_priv` VALUES( 'localhost'、 'mysql'、 'mysql.session'、 'user'、 'boot @ connecting host'、 '0000-00-00 00:00:00'、 'Select'、 ' '); INSERT INTO `tables_priv` VALUES( 'localhost'、 'sys'、 'mysql.sys'、 'sys_config'、 'root @ localhost'、 '2019-03-06 02:57:40'、 'Select'、 '' ); INSERT INTO `tables_priv` VALUES( '%'、 'test_db'、 'test_user'、 't1'、 'root @ localhost'、 '0000-00-00 00:00:00'、 'Select、Insert、Update、Delete '、' '); / *!40000 ALTER TABLE `tables_priv` ENABLE KEYS * /; 削除 '、' '); / *!40000 ALTER TABLE `tables_priv` ENABLE KEYS * /; 削除 '、' '); / *!40000 ALTER TABLE `tables_priv` ENABLE KEYS * /; UNLOCK TABLES;# 必要なデータを新しいインスタンスに挿入して、同じユーザーと権限を作成します
2.カスタムスクリプトのエクスポート
最初にステートメントをスプライスしてユーザーを作成します。
SELECT CONCAT( 'create user \' '、 user、 ' \ '@ \' '、 Host、 ' \ '' 'IDENTIFIED BY PASSWORD \' '、 authentication_string、 ' \ ';' )AS CreateUserQuery FROM mysql.`user` WHERE `User` NOT IN( 'mysql.session'、 'mysql.sys' ); #その 結果、新しいインスタンスが実行された後、同じパスワードを持つユーザーを作成できます mysql> SELECT- > CONCAT( -> 'create user \' '、 ->ユーザー、 -> '\' @ \ ''、 ->ホスト、 -> '\' ' -> 'パスワードによって識別されました\' '、 -> authentication_string、 ->' \ ';' - >)AS CreateUserQuery | パスワード '* 94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'によって識別されるユーザー 'test' @ '%'を作成します。| | ユーザー 'read' @ '%'を作成します パスワードで識別 '* 2158DEFBE7B6FC24585930DF63794A2A44F22736'; | > FROM - > mysql.`user` - > WHERE - > `User` NOT IN( - > 'mysql.session'、 - > 'mysql.sys' - >); + ------------------------------------------------- ------------------------------------------------ + | CreateUserQuery | + ------------------------------------------------- ------------------------------------------------ + | パスワード '* 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B'によって識別されるユーザー 'root' @ '%'を作成します。| | パスワード '* 8A447777509932F0ED07ADB033562027D95A0F17'によって識別されるユーザー 'test_user' @ '%'を作成します; | + ------------------------------------------------- ------------------------------------------------ + 4セット内の行(0.00秒)
次に、スクリプトを使用してユーザー権限をエクスポートします。
#导出权限脚本 #!/ bin / bash #Functionエクスポートユーザー権限 pwd = root expgrants() { mysql -B -u'root '-p $ {pwd} -N $ @ -e "SELECT CONCAT(' SHOW GRANTS FOR '' '、ユーザー、' '' @ '' '、ホスト、' ''; ')ASクエリ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 @% GRANT SELECT ON *。* TO 'read' @ '%'の許可; -root @%の付与*。* TO 'root' @ '%'にすべての特権を付与 付与オプション付き; -test @%の使用許諾*。* TO 'test' @ '%'; GRANT SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、EXECUTE、CREATE VIEW、SHOW VIEW ON `test_db`。* TO 'test' @ '%'; -test_user @%の付与 *。* TO 'test_user' @ '%'の使用を許可; `test_db`.`t1`でSELECT、INSERT、UPDATE、DELETEをGRANTして、 'test_user' @ '%'にします。 -mysql.session@localhostの付与 *。* TO 'mysql.session'@'localhost'にスーパーを付与; `performance_schema`。* TO 'mysql.session'@'localhost'に対してSELECTを許可します。 'mysql`.`user`のSELECTを' mysql.session'@'localhost 'に付与します。 -mysql.sys@localhostの使用 許可*。*を 'mysql.sys'@'localhost'に付与; `sys`。*でGRANT TRIGGERを 'mysql.sys' @ 'に付与 localhost '; 'sys`.`sys_config`のSELECTを' mysql.sys'@'localhost 'に付与します。
3. mysqlpumpがユーザーを直接エクスポートする
mysqlpumpは、mysqldumpの派生物であり、MySQL論理バックアップ用のツールです。mysqlpumpには、ユーザー作成ステートメントと権限のあるステートメントを直接エクスポートできるオプションがさらにあります。以下で説明しましょう:
#exclude-databasesExclude 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 #exported result -MySQLポンプによって作成されたダンプユーティリティ、バージョン:5.7.23、linux -glibc2.12(x86_64) -ダンプ開始時刻:2019年4月19日金曜日15 :03:02-サーバーバージョン:5.7.23 SET @OLD_UNIQUE_CHECKS = @@ UNIQUE_CHECKS、UNIQUE_CHECKS = 0 ; SET @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS、FOREIGN_KEY_CHECKS = 0; SET @OLD_SQL_MODE = @@ SQL_MODE; SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET @@ SESSION.SQL_LOG_BIN = 0; SET @OLD_TIME_ZONE = @@ TIME_ZONE; SET TIME_ZONE = '+ 00:00'; SET @OLD_CHARACTER_SET_CLIENT = @@ CHARACTER_SET_CLIENT; SET @OLD_CHARACTER_SET_RESULTS = @@ CHARACTER_SET_RESULTS; SET @OLD_COLLATION_CONNECTION = @@ COLLATION_CONNECTION; 名前の設定utf8mb4; CREATE USER 'read' @ '%' IDENTIFIED WITH 'mysql_native_password' AS '* 2158DEFBE7B6FC24585930DF63794A2A44F22736' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; GRANT SELECT ON *。* TO 'read' @ '%'; CREATE USER 'root' @ '%' IDENTIFIED WITH 'mysql_native_password' AS '* 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; すべての特権を*。*に 'root' @ '%'に付与 CREATE USER 'test' @ '%' IDENTIFIED WITH 'mysql_native_password' AS '* 94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; *。* TO 'test' @ '%'の使用を許可; GRANT SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、EXECUTE、CREATE VIEW、SHOW VIEW ON `test_db`。* TO 'test' @ '%'; CREATE USER 'test_user' @ '%' IDENTIFIED WITH 'mysql_native_password' AS '* 8A447777509932F0ED07ADB033562027D95A0F17' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK; *。* TO 'test_user' @ '%'の使用を許可; `test_db`.`t1`でSELECT、INSERT、UPDATE、DELETEをGRANTして、 'test_user' @ '%'にします。 SET TIME_ZONE = @ OLD_TIME_ZONE; SET CHARACTER_SET_CLIENT = @ OLD_CHARACTER_SET_CLIENT; SET CHARACTER_SET_RESULTS = @ OLD_CHARACTER_SET_RESULTS; SET COLLATION_CONNECTION = @ OLD_COLLATION_CONNECTION; SET FOREIGN_KEY_CHECKS = @ OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS = @ OLD_UNIQUE_CHECKS; -SET SQL_MODE = @ OLD_SQL_MODE; -ダンプ終了時間:金曜日4月19日15:03:02 2019# ユーザー作成とエクスポート結果のみを表示できます権限付与ステートメントは非常に使いやすいです。 #mysqlpump詳細な使用法については、次を参照して ください。https ://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
総括する:
この記事では、データベースユーザー情報をエクスポートするための3つのスキームを紹介します。各スキームにはスクリプトが与えられ、デモが行われます。同時に、これらの3つのプログラムは、少しカプセル化した後で、データベースユーザー権限をバックアップするためのスクリプトとして使用できます。pt-show-grantsなどの他のソリューションがあるかもしれません。それらを共有することを歓迎します。また、それらを収集したり、より適切なスクリプトに変換したりすることもできます。特に、インスタンスに多数のユーザーがいる場合は、それらをいつか使用するかもしれません。いつ、あなたはスクリプトが使用する方が良いでしょう。
上記はMySQLがアカウント関連情報をエレガントにバックアップする方法の詳細です
この記事のアドレス:https : //www.linuxprobe.com/mysql-linux-one.html