実際の戦闘:Mysqlデータベースのfrmファイルから、テーブル構造を抽出してSQLステートメントを作成します

要求する

たとえば、mysqlデータベースを起動できない場合、テーブルのibdファイルを別のデータベースにコピーし、ビジネスデータベースを復元する必要があります。ビジネスデータを復元する前提は、別のデータベースで作成する必要があることです。データベーステーブルの構造はまったく同じです。このとき、Mysqlデータベースのfrmファイルからテーブル構造を抽出してsqlステートメントを作成する必要があります。

frmファイルのテーブル構造を読み取るには、最初にmysqlツールセットrpmパッケージをインストールする必要があります。mysql-utilities-1.6.5-1.el7.noarch.rpmバージョンをインストールしました。このパッケージはmysqlから入手できます。公式ウェブサイトのダウンロード、彼はmysql-connector-pythonパッケージに依存しているため、公式ウェブサイトからもダウンロードする必要があります。

インストールプロセスは次のとおりです


[root@mysql ~]# yum install mysql-connector-python-2.1.8-1.el7.x86_64.rpm
[root@mysql ~]# yum install mysql-utilities-1.6.5-1.el7.noarch.rpm

友人の中には質問があるかもしれません。mysqlデータベースを起動できなかったので、mysqlfrmはテーブル構造を抽出してSQLステートメントを作成できますか?実際にテストしてみましょう。

mysqldサービスプロセスがあるかどうかを確認します


[mysql@mysql ~]$ ps -ef|grep -i mysqldmysql
74835  70672  0 16:45 pts/1    00:00:00 grep --color=auto -i mysqld

mysqlfrmを使用してテーブル構造を抽出します

[mysql@mysql testdb]$ mysqlfrm --diagnostic /data/mysql/data/3306/testdb/test1.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for /data/mysql/data/3306/testdb/test1.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `testdb`.`test1` (
  `id` int(11) NOT NULL,
  `name1` char(40) NOT NULL,
  `name2` char(80) NOT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;

#...done.

ご覧のとおり、SQLステートメントを作成するためにtest1のテーブル構造が抽出されています。抽出されたステートメントが正しいかどうかを見てみましょう。


[root@localhost] 16:53:24 [testdb]>show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| test1            |
+------------------+
1 row in set (0.00 sec)

[root@localhost] 16:53:32 [testdb]>show create table test1\G;
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `id` int(11) NOT NULL,
  `name1` char(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `name2` char(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.03 sec)

ERROR:
No query specified

元のテーブル構造と抽出されたテーブル構造を比較します。違いはありますか?これは、mysqlfrmが、データベースに接続せずにテーブル構造SQLステートメントを抽出するときに使用する文字セットを認識できないためです。このテストテーブルでは、使用される文字セットはutf8mb4であり、1文字は4バイトの長さを占めるため、ここで、charとvarcharの長さを4で割って、正しいテーブル構造のsqlステートメントにする必要があります。

おすすめ

転載: blog.51cto.com/15061930/2642092