MySQLサーバー全体をバックアップおよび復元するための自動化されたソリューションを作成する過程で、ユーザーが含まれているように見えるmysql
データベースに遭遇しましたアカウント、権限、メタデータなどです。このデータベースをバックアップする必要がありますか?バックアップして復元しようとすると、問題が発生しますか?
私が想像できるように、「mysqlがmysqlデータベースをバックアップする」ことについて、グーグルの時間を過ごしてきました。
ここで検討すべき興味深い点があります。mysql
データベースをバックアップすると、そのようなデータベースを、バックアップを実行したmysqlの同じバージョンにしか復元できないという大きな制限があります。理由は次のとおりです。
これはMySQL 5.0.45のmysql.userです
mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | | |
| x509_issuer | blob | NO | | | |
| x509_subject | blob | NO | | | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.01 sec)
これはMySQL 5.1.32のmysql.userです。
mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)
これはMySQL 5.5.12のmysql.userです
mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | YES | | | |
| authentication_string | text | YES | | NULL | |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.01 sec)
意図していないバージョンのMySQLにmysql.userを復元しようとすると、ランダムな権限の問題が発生します。バージョンにとらわれない方法でmysqlユーザー権限をバックアップする方法は、SQLでユーザー権限をダンプすることです。このように、ユーザーの許可は完全に移植可能です。これを行うには2つの方法があります。
オプション#1:MAATKITを使用する
mk-show-grantsは、接続するmysqlインスタンスに必要なSQLを生成します。 (MAATKITはPercona Toolkitに移行されていることに注意してください。このツールは、おそらくpt-show-grantsと呼ばれます)。
オプション#2:SQL GRANTSのダンプのスクリプト
Mk-show-grantsの独自のエミュレーションを作成しました。匿名ユーザーは除外されます。次のようになります。
mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
これらのオプションのいずれかを使用すると、ユーザー許可のより安定したバックアップが作成されます。
別のメモ
このlog-outputオプションを使用している場合
[mysqld]
log-output=TABLE
mysqlデータベースは、遅いログ(有効な場合)を、テキストファイルではなくmysqlスキーマのmysqlテーブルとして入力します。したがって、物理バックアップを実行すると、そのようなmysqlテーブルベースのログが含まれます。信じてください。一般的なログとスロークエリログが有効になっていて、mysqlスキーマに蓄積されている場合は、ディスク容量の価値はありません。 MySQL Grants Dump Optionsをそのまま使用してください。
UPDATE 2011-09-19 15:54 EDT
SQL Grantsを介してMySQL権限のバックアップを維持する上で非常に重要な要素が1つあります。
各ユーザーは、変更されたMD5形式でパスワードを取得します。 mysql 4.0以降の場合、これは16文字の16進数文字列です。 mysql 4.1+の場合、41文字です(アスタリスクの後に40文字の16進文字列が続きます)。
SQL Grantsダンプを復元する前に、SQL Grantsダンプファイルで16文字の16進数のパスワードを確認してください。 1つでも表示される場合は、復元先のmysqlサーバーの/etc/my.cnf(Windowsの場合はmy.ini)に以下を追加する必要があります。
[mysqld]
old_password=1
old_password ディレクティブは、16文字と41文字のパスワードが共存し、同じ実行中のmysqlインスタンスで正しく認証されることを許可します。今後作成されるパスワードはすべて16文字になります。
MySQLの再起動は必要ありません。これを実行するだけです:
SET GLOBAL old_password = 1;
はい、あなたは間違いなくmysql
データベースをバックアップしたいと思っています-それはあなたのサービスの不可欠な部分です。 canは他の情報からコンテンツを再構築しますが、迅速にサービスを再開しようとする場合、そうするのは困難です。
Mysqlデータベースをバージョン間で復元できます。少なくともかなり最近のバージョンです。新しいバージョンのMySQLには、システムテーブルをアップグレードするmysql_upgrade
というツールが含まれています。
同様のmysqlバージョンに復元する限り、mysqlデータベースをバックアップから復元できます。疑問がある場合は、mysqlデータベーススキーマ(バックアップからのスキーマと新しいmysqlサーバーからのスキーマ)を比較してください。