mysqlfrm可基於frm文件生成對應的表結構。經常使用於數據恢復場景。mysql
其有兩種操做模式。linux
1. 建立一個臨時實例來解析frm文件。sql
2. 使用診斷模式解析frm文件。socket
如下表進行測試,看看,ide
1. mysqlfrm解析的結果與原生表結構的區別。測試
2. 兩種操做模式解析結果的不一樣。ui
mysql> show create table t_child\G *************************** 1. row *************************** Table: t_child Create Table: CREATE TABLE `t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`child_id`), KEY `parent_id` (`parent_id`), CONSTRAINT `t_child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `t_parent` (`parent_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
首先看看第一種操做模式。this
既然是建立臨時實例,確定須要知道軟件所在的位置,有兩種方式。atom
1. 指定--basedirspa
$ mysqlfrm --basedir=/usr/local/mysql7 /tmp/t_child.frm --port=3333
# Starting the spawned server on port 3333 ... done. # Reading .frm files # # Reading the t_child.frm file. # # CREATE statement for /tmp/t_child.frm: # CREATE TABLE `tmp`.`t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`child_id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 #...done.
2. 指定--server
$ mysqlfrm --server=root:123456@127.0.0.1:3307 /tmp/t_child.frm --port=2323
WARNING: Using a password on the command line interface can be insecure. # Source on 127.0.0.1: ... connected. # Starting the spawned server on port 2323 ... done. # Reading .frm files # # Reading the t_child.frm file. # # CREATE statement for /tmp/t_child.frm: # CREATE TABLE `tmp`.`t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`child_id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 #...done.
注意,指定--server和--basedir沒有多大區別,主要也是爲了獲取basedir。
從上面的輸出能夠看到,相對於其原生表結構,打印出的表結構,
1. 沒有自增主鍵的序列信息。
2. 沒有外鍵約束。
再來看看經過診斷模式解析的結果。
$ mysqlfrm --diagnostic /tmp/t_child.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 es pecially 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 /tmp/t_child.frm: # The .frm file is a TABLE. # CREATE TABLE Statement: CREATE TABLE `tmp`.`t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY `PRIMARY` (`child_id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB; #...done.
相對於經過臨時實例來解析frm文件,經過診斷模式解析的結果沒有字符集。
其它選項
--show-stats:打印frm文件信息
$ mysqlfrm --diagnostic /tmp/t_child.frm --show-stats # 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 /tmp/t_child.frm: # The .frm file is a TABLE. # CREATE TABLE Statement: CREATE TABLE `tmp`.`t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY `PRIMARY` (`child_id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB; # File Statistics: # Last Modified : Thu Jul 12 23:36:12 2018 # Creation Time : Thu Jul 12 23:36:25 2018 # Last Accessed : Thu Jul 12 23:36:42 2018 # Mode : 33188 # Size : 8608 # Table Statistics: # Engine : INNODB # frm Version : 9 # MySQL Version : 5.7.22 # frm File_Version : 5 # IO_SIZE : 4096 # Def Partition Engine : None #...done.
注意:
若是使用方式1解析frm文件出現問題,可打開debug模式,如,
$ mysqlfrm --server=root:123456@127.0.0.1:3307 /tmp/t_child.frm --port=2323 -vvv
WARNING: Using a password on the command line interface can be insecure. # Source on 127.0.0.1: ... connected. # Checking read access to .frm files # Creating a temporary datadir = /tmp/tmpA4tVug # Starting the spawned server on port 2323 ... # Cloning the MySQL server located at /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64. # Configuring new instance... # Locating mysql tools... # Location of files: # mysqld: /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqld # mysqladmin: /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqladmin # Setting up empty database and mysql tables... 2018-07-13T00:36:29.211443Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-07-13T00:36:30.209454Z 0 [Warning] InnoDB: New log files created, LSN=45790 2018-07-13T00:36:30.335785Z 0 [Warning] InnoDB: Creating foreign key constraint system tables. 2018-07-13T00:36:30.441182Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: c90ecb11-8634-11e 8-a908-00163e0cf2bb.2018-07-13T00:36:30.443663Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened. 2018-07-13T00:36:30.444160Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. # Starting new instance of the server... # Startup command for new server: /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqld --no-defaults --basedir=/usr/local/mysql-5.7.22-linux-glibc2.12-x86_64 --datadir=/tmp/tmpA4tVug --pid-file=/tmp/tmpA4tVug/clone.pid --port=2323 --server-id=101 --socket=/tmp/tmpA4tVug/mysql.sock --tmpdir=/tmp/tmpA4tVug# Testing connection to new instance... 2018-07-13T00:36:33.643490Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2018-07-13T00:36:33.643662Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled 2018-07-13T00:36:33.643709Z 0 [Note] /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqld (mysqld 5.7.22) starting as process 18776 ... 2018-07-13T00:36:33.650009Z 0 [Note] InnoDB: PUNCH HOLE support available 2018-07-13T00:36:33.650037Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2018-07-13T00:36:33.650042Z 0 [Note] InnoDB: Uses event mutexes 2018-07-13T00:36:33.650046Z 0 [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier 2018-07-13T00:36:33.650050Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3 2018-07-13T00:36:33.650054Z 0 [Note] InnoDB: Using Linux native AIO 2018-07-13T00:36:33.650346Z 0 [Note] InnoDB: Number of pools: 1 2018-07-13T00:36:33.650451Z 0 [Note] InnoDB: Using CPU crc32 instructions 2018-07-13T00:36:33.652049Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M 2018-07-13T00:36:33.676202Z 0 [Note] InnoDB: Completed initialization of buffer pool 2018-07-13T00:36:33.679296Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). 2018-07-13T00:36:33.690571Z 0 [Note] InnoDB: Highest supported file format is Barracuda. 2018-07-13T00:36:33.722958Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables 2018-07-13T00:36:33.723014Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... 2018-07-13T00:36:33.862563Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. 2018-07-13T00:36:33.863553Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active. 2018-07-13T00:36:33.863565Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active. 2018-07-13T00:36:33.863831Z 0 [Note] InnoDB: Waiting for purge to start 2018-07-13T00:36:33.914001Z 0 [Note] InnoDB: 5.7.22 started; log sequence number 2589156 2018-07-13T00:36:33.914376Z 0 [Note] Plugin 'FEDERATED' is disabled. 2018-07-13T00:36:33.920024Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key 2018-07-13T00:36:33.920043Z 0 [Note] Server hostname (bind-address): '*'; port: 2323 2018-07-13T00:36:33.920081Z 0 [Note] IPv6 is available. 2018-07-13T00:36:33.920088Z 0 [Note] - '::' resolves to '::'; 2018-07-13T00:36:33.920106Z 0 [Note] Server socket created on IP: '::'. 2018-07-13T00:36:33.920400Z 0 [Note] InnoDB: Loading buffer pool(s) from /tmp/tmpA4tVug/ib_buffer_pool 2018-07-13T00:36:33.922124Z 0 [Note] InnoDB: Buffer pool(s) load completed at 180713 8:36:33 2018-07-13T00:36:33.923975Z 0 [Warning] Insecure configuration for --pid-file: Location '/tmp' in the path is accessible to all OS users. Consider choosing a different directory. 2018-07-13T00:36:33.931917Z 0 [Note] Event Scheduler: Loaded 0 events 2018-07-13T00:36:33.932165Z 0 [Note] /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqld: ready for connections. Version: '5.7.22' socket: '/tmp/tmpA4tVug/mysql.sock' port: 2323 MySQL Community Server (GPL) # trying again... # Success! # Setting the root password... mysqladmin: [Warning] Using a password on the command line interface can be insecure. Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. # Connection Information: # -uroot -proot --socket=/tmp/tmpA4tVug/mysql.sock #...done. # Connecting to spawned server 2018-07-13T00:36:34.461329Z 2 [Note] Aborted connection 2 to db: 'unconnected' user: 'root' host: 'localhost' (Got an error reading communication packets) done. # Reading .frm files # # Reading the t_child.frm file. # Changing engine for .frm file /tmp/tmpA4tVug/tmp_temp/t_child.frm: # Skipping to header at : 2 # General Data from .frm file: {'IO_SIZE': 4096, 'MYSQL_VERSION_ID': 50722, 'avg_row_length': 0, 'charset_low': 0, 'create_options': 8, 'db_create_pack': 2, 'default_charset': 8, 'default_part_eng': 0, 'extra_size': 31, 'frm_file_ver': 5, 'frm_version': 9, 'key_block_size': 0, 'key_info_length': 60, 'key_length': 706, 'legacy_db_type': 'INNODB', 'length': 12288, 'max_rows': 0, 'min_rows': 0, 'rec_length': 9, 'row_type': 0, 'table_charset': 8, 'tmp_key_length': 706} # Engine string: InnoDB # Server version in file: 5.7.22 # # CREATE statement for /tmp/t_child.frm: # CREATE TABLE `tmp`.`t_child` ( `child_id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, PRIMARY KEY (`child_id`), KEY `parent_id` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 # Shutting down spawned server # Removing the temporary datadir 2018-07-13T00:36:34.502751Z 0 [Note] Giving 0 client threads a chance to die gracefully 2018-07-13T00:36:34.502772Z 0 [Note] Shutting down slave threads 2018-07-13T00:36:34.502777Z 0 [Note] Forcefully disconnecting 0 remaining clients 2018-07-13T00:36:34.502785Z 0 [Note] Event Scheduler: Purging the queue. 0 events 2018-07-13T00:36:34.502916Z 0 [Note] Binlog end 2018-07-13T00:36:34.502973Z 0 [Note] Shutting down plugin 'ngram' 2018-07-13T00:36:34.502979Z 0 [Note] Shutting down plugin 'ARCHIVE' 2018-07-13T00:36:34.502982Z 0 [Note] Shutting down plugin 'partition' 2018-07-13T00:36:34.502985Z 0 [Note] Shutting down plugin 'BLACKHOLE' 2018-07-13T00:36:34.502989Z 0 [Note] Shutting down plugin 'PERFORMANCE_SCHEMA' 2018-07-13T00:36:34.503028Z 0 [Note] Shutting down plugin 'CSV' 2018-07-13T00:36:34.503032Z 0 [Note] Shutting down plugin 'MEMORY' 2018-07-13T00:36:34.503036Z 0 [Note] Shutting down plugin 'MRG_MYISAM' 2018-07-13T00:36:34.503041Z 0 [Note] Shutting down plugin 'MyISAM' 2018-07-13T00:36:34.503049Z 0 [Note] Shutting down plugin 'INNODB_SYS_VIRTUAL' 2018-07-13T00:36:34.503052Z 0 [Note] Shutting down plugin 'INNODB_SYS_DATAFILES' 2018-07-13T00:36:34.503055Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLESPACES' 2018-07-13T00:36:34.503058Z 0 [Note] Shutting down plugin 'INNODB_SYS_FOREIGN_COLS' 2018-07-13T00:36:34.503061Z 0 [Note] Shutting down plugin 'INNODB_SYS_FOREIGN' 2018-07-13T00:36:34.503064Z 0 [Note] Shutting down plugin 'INNODB_SYS_FIELDS' 2018-07-13T00:36:34.503066Z 0 [Note] Shutting down plugin 'INNODB_SYS_COLUMNS' 2018-07-13T00:36:34.503069Z 0 [Note] Shutting down plugin 'INNODB_SYS_INDEXES' 2018-07-13T00:36:34.503072Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLESTATS' 2018-07-13T00:36:34.503075Z 0 [Note] Shutting down plugin 'INNODB_SYS_TABLES' 2018-07-13T00:36:34.503077Z 0 [Note] Shutting down plugin 'INNODB_FT_INDEX_TABLE' 2018-07-13T00:36:34.503080Z 0 [Note] Shutting down plugin 'INNODB_FT_INDEX_CACHE' 2018-07-13T00:36:34.503083Z 0 [Note] Shutting down plugin 'INNODB_FT_CONFIG' 2018-07-13T00:36:34.503086Z 0 [Note] Shutting down plugin 'INNODB_FT_BEING_DELETED' 2018-07-13T00:36:34.503088Z 0 [Note] Shutting down plugin 'INNODB_FT_DELETED' 2018-07-13T00:36:34.503091Z 0 [Note] Shutting down plugin 'INNODB_FT_DEFAULT_STOPWORD' 2018-07-13T00:36:34.503094Z 0 [Note] Shutting down plugin 'INNODB_METRICS' 2018-07-13T00:36:34.503096Z 0 [Note] Shutting down plugin 'INNODB_TEMP_TABLE_INFO' 2018-07-13T00:36:34.503099Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_POOL_STATS' 2018-07-13T00:36:34.503102Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_PAGE_LRU' 2018-07-13T00:36:34.503105Z 0 [Note] Shutting down plugin 'INNODB_BUFFER_PAGE' 2018-07-13T00:36:34.503108Z 0 [Note] Shutting down plugin 'INNODB_CMP_PER_INDEX_RESET' 2018-07-13T00:36:34.503111Z 0 [Note] Shutting down plugin 'INNODB_CMP_PER_INDEX' 2018-07-13T00:36:34.503113Z 0 [Note] Shutting down plugin 'INNODB_CMPMEM_RESET' 2018-07-13T00:36:34.503116Z 0 [Note] Shutting down plugin 'INNODB_CMPMEM' 2018-07-13T00:36:34.503119Z 0 [Note] Shutting down plugin 'INNODB_CMP_RESET' 2018-07-13T00:36:34.503122Z 0 [Note] Shutting down plugin 'INNODB_CMP' 2018-07-13T00:36:34.503124Z 0 [Note] Shutting down plugin 'INNODB_LOCK_WAITS' 2018-07-13T00:36:34.503127Z 0 [Note] Shutting down plugin 'INNODB_LOCKS' 2018-07-13T00:36:34.503130Z 0 [Note] Shutting down plugin 'INNODB_TRX' 2018-07-13T00:36:34.503132Z 0 [Note] Shutting down plugin 'InnoDB' 2018-07-13T00:36:34.503182Z 0 [Note] InnoDB: FTS optimize thread exiting. 2018-07-13T00:36:34.503325Z 0 [Note] InnoDB: Starting shutdown... #...done. [test@slowtech ~]$ 2018-07-13T00:36:34.603656Z 0 [Note] InnoDB: Dumping buffer pool(s) to /tmp/tmpA4tVug/ib_buffer_pool 2018-07-13T00:36:34.603717Z 0 [ERROR] InnoDB: Cannot open '/tmp/tmpA4tVug/ib_buffer_pool.incomplete' for writing: No such file or directory 2018-07-13T00:36:35.517978Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2589175 2018-07-13T00:36:35.518034Z 0 [Note] Shutting down plugin 'sha256_password' 2018-07-13T00:36:35.518040Z 0 [Note] Shutting down plugin 'mysql_native_password' 2018-07-13T00:36:35.518200Z 0 [Note] Shutting down plugin 'binlog' 2018-07-13T00:36:35.518563Z 0 [Note] Unable to delete pid file: No such file or directory 2018-07-13T00:36:35.518568Z 0 [Note] /usr/local/mysql-5.7.22-linux-glibc2.12-x86_64/bin/mysqld: Shutdown complete