Decode a MySQL .frm file and output a CREATE VIEW or CREATE TABLE statement.

This command does not require a MySQL server and interprets a .frm file according to rules similar to the MySQL server.

For more information on how this command works see Description of the .frm format


This program only decodes data strictly available in the .frm file. InnoDB foreign-key references are not preserved and AUTO_INCREMENT values are also not preserved as these are stored outside of the .frm.


Usage: dbsake frmdump [options] [path...]

  Dump schema from MySQL frm files.

  -t, --type-codes  Show mysql type codes in comments on each column
  -r, --recursive   Recursively search directories for .frm files.
  -R, --replace     Output views with CREATE OR REPLACE
  -?, --help        Show this message and exit.


$ dbsake frmdump --type-codes /var/lib/mysql/mysql/plugin.frm
-- Table structure for table `plugin`
-- Created with MySQL Version 5.5.35

CREATE TABLE `plugin` (
  `name` varchar(64) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
  `dl` varchar(128) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
  PRIMARY KEY (`name`)

$ dbsake frmdump /var/lib/mysql/sakila/actor_info.frm
-- View:         actor_info
-- Timestamp:    2014-01-04 05:29:55
-- Stored MD5:   402b8673b0c61034644b5b286519d3f1
-- Computed MD5: 402b8673b0c61034644b5b286519d3f1

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY INVOKER VIEW `actor_info` select `a`.`actor_id` AS `actor_id`,`a`.`first_name` AS `first_name`,`a`.`last_name` AS `last_name`,group_concat(distinct concat(`c`.`name`,': ',(select group_concat(`f`.`title` order by `f`.`title` ASC separator ', ') from ((`sakila`.`film` `f` join `sakila`.`film_category` `fc` on((`f`.`film_id` = `fc`.`film_id`))) join `sakila`.`film_actor` `fa` on((`f`.`film_id` = `fa`.`film_id`))) where ((`fc`.`category_id` = `c`.`category_id`) and (`fa`.`actor_id` = `a`.`actor_id`)))) order by `c`.`name` ASC separator '; ') AS `film_info` from (((`sakila`.`actor` `a` left join `sakila`.`film_actor` `fa` on((`a`.`actor_id` = `fa`.`actor_id`))) left join `sakila`.`film_category` `fc` on((`fa`.`film_id` = `fc`.`film_id`))) left join `sakila`.`category` `c` on((`fc`.`category_id` = `c`.`category_id`))) group by `a`.`actor_id`,`a`.`first_name`,`a`.`last_name`;


Changed in version 2.0.0: frm-to-schema was renamed to frmdump

-R, --replace

Output view as CREATE OR REPLACE so that running the DDL against MySQL will overwrite a view.

-t, --type-codes

Add comment to base tables noting the underlying mysql type code as MYSQL_TYPE_<name>.

-r, --recursive

If any directory path is specified on the commandline, recursively search that directory and dump any files ending in .frm

path [path...]

Specify the .frm files to generate a CREATE TABLE command from.

New in version 1.0.2: Support for indexes with a prefix length in binary .frm files; e.g. KEY (blob_value(255))

Changed in version 1.0.2: Views are parsed from .frm files rather than skipped.

Changed in version 1.0.2: Raw MySQL types are no longer added as comments unless the –raw-types option is specified.

Changed in version 1.0.2: A – Table structure for table `<name>` comment is added before each table

Changed in version 2.0.0: The --raw-types option was renamed to frmdump --type-codes.

New in version 1.0.2: The frmdump --replace option

New in version 2.1.1: The frmdump --recursive option