MySQLサーバー全体をバックアップおよび復元するための自動化されたソリューションを作成する過程でmysql
、ユーザーアカウント、権限、メタデータなどが含まれていると思われるデータベースに出会いました。このデータベースをバックアップする必要がありますか?バックアップして復元しようとすると問題が発生しますか?
ご想像のとおり、「mysqlがmysqlデータベースをバックアップする」ためにグーグルでやったことがあります。
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.userを意図していないバージョンのMySQLに復元しようとすると、ランダムなアクセス許可の問題が発生します。バージョンに依存しない方法で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
これらのオプションのいずれかを使用すると、ユーザー許可のより安定したバックアップが作成されます。
別のメモに
このログ出力オプションを使用している場合
[mysqld]
log-output=TABLE
mysqlデータベースは、スローファイル(有効な場合)をテキストファイルではなくmysqlスキーマのmysqlテーブルとして設定します。そのため、物理バックアップを実行すると、このようなmysqlテーブルベースのログが含まれます。一般的なログとスロークエリログが有効になっていて、mysqlスキーマに蓄積されている場合、ディスクスペースの価値はありません。MySQL Grantsのダンプオプションに固執するだけです。
更新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ディレクティブが共存し、正しく同じ実行中のMySQLインスタンスに認証するために、16文字と41-文字のパスワードを許可します。今後作成されるパスワードは16文字です。
MySQLの再起動は必要ありません。これを実行するだけです:
SET GLOBAL old_password = 1;
SHOW GRANTS
SQLを使用して生成SQLをつづりますQUOTE()
。SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';') FROM mysql.user WHERE user<>'';
はい、あなたは間違いなくmysql
データベースをバックアップしたいです-それはあなたのサービスの不可欠な部分です。他の情報からコンテンツを再構築することはできますが、すぐにサービスに戻ろうとする場合、再構築するのは困難です。
バージョン間、少なくともかなり新しいバージョン間でmysqlデータベースを復元できます。mysql_upgrade
システムテーブルをアップグレードするMySQLの新しいバージョンに含まれるというツールがあります。
同様のmysqlバージョンに復元する限り、バックアップからmysqlデータベースを復元できます。疑問がある場合は、mysqlデータベーススキーマ(バックアップからのスキーマと新しいmysqlサーバーからのスキーマ)の差分を作成してください。