如何从mysql数据库中获取一个表的表结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从mysql数据库中获取一个表的表结构相关的知识,希望对你有一定的参考价值。

参考技术A 列出表(列)结构:
mysql< DESCRIBE tableName;
mysql< DESCRIBE tableName columnName;
mysql< DESC tableName;
mysql< SHOW COLUMNS FROM tableName;
% mysqlshow dbName tableName!
参考技术B show create table 表名; 参考技术C desc语句看看 参考技术D

Online DDL 工具:pt-osc

对于 MySQL Online DDL 目前主流的有三种工具:

    原生 Online DDL;

    pt-osc(online-schema-change),

    gh-ost

    本文主要讲解 pt-online-schema-change 的使用以及三种工具的简单对比。

    一、原理及限制

    1.1 原理

    1. 创建一个与原表结构相同的空表,表名是 _new 后缀;

    2. 修改步骤 1 创建的空表的表结构;

    3. 在原表上加三个触发器:delete/update/insert,用于 copy 数据过程中,将原表中要执行的语句在新表中执行;

    4. 将原表数据以数据块(chunk)的形式 copy 到新表;

    5. rename 原表为 old 表,并把新表 rename 为原表名,然后删除旧表;

    6. 删除触发器。

第5个回答  2017-02-13 desc语句看看

实战:从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 mysqldmysql74835  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: test1Create 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_ci1 row in set (0.03 sec)
ERROR:No query specified

对比一下原始表结构和提取出来的表结构,是不是发现有不一样的地方,这是因为mysqlfrm在不连接数据库提取表结构sql语句时,是无法知道用什么字符集的。在这个测试表,用的字符集是utf8mb4,一个字符占用4个字节长度,所以在这里,还需要将char,varchar的长度除4,才是正确的表结构sql语句。


以上是关于如何从mysql数据库中获取一个表的表结构的主要内容,如果未能解决你的问题,请参考以下文章

mysql中有2个结构一样的表,我想把两个表的交集存到另一个表中,请问怎么操作呢?

如何从 MySQL 数据库中的表的列中导出 .txt 文件?

在php连接数据库中,怎么获取某一个表的某个列的id号?

mysql 查询怎么获取数据库下所有表的信息?

mysql 千万级数据库如何进行多张结构相同的表联合查询?如何优化或设置提高查询速度?

从另一个没有数据的表的结构创建表