實戰:從Mysql數據庫frm文件中,提取表結構建立SQL語句

需求python

在某些特殊的場景下,例如你的mysql數據庫沒法啓動,須要你將表的ibd文件拷貝到另外一個數據庫中,恢復業務數據庫,恢復業務數據的前提,是你須要在另外一個數據庫中,建立好如出一轍的表結構。這時你就須要從Mysql數據庫的frm文件中,提取表結構建立sql語句。mysql

要想讀取frm文件中的表結構,你須要先安裝mysql的工具集rpm包,我安裝的是mysql-utilities-1.6.5-1.el7.noarch.rpm這個版本,這個包能夠從mysql官方網站下載,他依賴mysql-connector-python包,因此也須要從官網下載。sql

安裝過程以下所示數據庫

[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語句呢,下面就來實戰測試一下ide

檢查是否有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.

能夠看到,已經提取到test1的表結構建立sql語句了,那來看看,提取到的語句是不是正確的。網站

[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,一個字符佔用4個字節長度,因此在這裏,還須要將char,varchar的長度除4,纔是正確的表結構sql語句。code

相關文章
相關標籤/搜索