尝试使用SQL命令复制整个MySQL模式

时间:2014-06-11 17:38:46

标签: mysql sql

搜索完SO后,我找到了以下答案:

  1. 如何使用mysqldump复制整个MySQL架构
  2. 如何使用PHP复制整个MySQL架构
  3. 如何使用MySQL企业版
  4. 复制整个MySQL架构
  5. 如何使用菜单复制整个Microsoft SQL Server架构。
  6. 我还发现了一些关于使用SQL命令复制MySQL模式的提示。
  7. 我的问题:如果我使用以下SQL命令复制MySQL架构,那么旧架构的哪些部分不会被复制?指标?约束?看法?还有什么吗?

    CREATE SCHEMA new_schema DEFAULT CHARACTER SET utf8;
    
    CREATE TABLE new_schema.table1 LIKE old_schema.table1;
    CREATE TABLE new_schema.table2 LIKE old_schema.table2;
    CREATE TABLE new_schema.table3 LIKE old_schema.table3;
    ...;
    
    INSERT INTO new_schema.table1 SELECT * FROM old_schema.table1;
    INSERT INTO new_schema.table2 SELECT * FROM old_schema.table2;
    INSERT INTO new_schema.table3 SELECT * FROM old_schema.table3;
    ...;
    

2 个答案:

答案 0 :(得分:8)

CREATE TABLE ... LIKE将处理索引和约束。

运行此命令时应注意SET FOREIGN_KEY_CHECKS=0,因为如果table1具有table2的外键,则创建table1将失败。同样,以错误的顺序将数据插入表中也会失败。

您的脚本不包括:

  • 浏览
  • 触发器
  • 存储过程
  • 存储功能
  • 活动

这些其他对象没有CREATE... LIKE...个语句。您必须使用SHOW CREATE...,然后在新架构的上下文中运行它。请参阅此处的各种SHOW CREATE...语句:http://dev.mysql.com/doc/refman/5.6/en/show.html

我还提醒您INSERT INTO... SELECT FROM...的工作方式,但如果表非常大,可以填满您的回滚段。像pt-archiver这样的工具尝试批量复制表,沿主键上升,以避免出现此问题。

答案 1 :(得分:2)

我认为例程不能直接用sql命令复制(据我所知,没有像create procedure myProc like old.myProc这样的东西)。

我建议您使用mysqldump,因为它负责复制所有内容,包括数据(如果您不想复制数据,可以使用-d开关来阻止创建insert陈述。

如果要创建“模板”(与其他数据库完全相同但没有数据的数据库),可以使用以下命令:

mysqldump [connectionParameters] -d -R -v yourOldDatabase > databaseTemplate.sql

解释了选项:

  • [connectionParameters]:主机,用户和密码
  • -d:不要复制数据
  • -R:在转储中包含例程
  • -v:输出mysqldump正在对控制台执行的操作

您可以打开此“light”sql脚本来检查对象的创建方式。

希望这有帮助