【问题标题】:Duplicate a whole database on the same server?在同一台服务器上复制整个数据库?
【发布时间】:2014-04-14 04:53:38
【问题描述】:

我们正在运行一项服务,我们必须为每个新站点设置一个新数据库。数据库完全相同,因此我们可以简单地从同一服务器的备份文件中转储或从示例数据库中克隆(仅为克隆目的创建,不会在那里运行任何事务,因此无需担心损坏数据)。它自己的数据库包含大约 100 个表和一些数据,大约需要 1-2 分钟才能导入,这太慢了。

我正在尝试尽快找到一种方法,首先想到的是复制示例数据库 data_dir 中的文件,但似乎我还需要以某种方式编辑表格列表或mysql 将无法读取我的新数据库的表,即使它仍然在那里显示它们。

【问题讨论】:

  • 正在复制多少 GB 的数据?你能告诉我你在做什么需要 1-2 分钟吗?
  • 当然,现在它是一个使用 mysql -uusername -ppassword datatabase.dump.sql 的简单恢复数据库。我还将 autocomit、unique_check、foreign_key_checks 设置为 OFF
  • 那么这就解释了为什么它很慢,你是从磁盘读取整个数据库,将其转换为 mysql 源代码插入语句,然后以非常低效的格式将整个数据库写入磁盘,然后再次从磁盘读取它,解析大量的 sql 查询,执行它们,最后再次写入所有数据。可怕的想法。这不是复制数据库的方式。

标签: mysql mariadb


【解决方案1】:

你复制数据库的方式不对,如果你做得好,速度会快很多。

以下是复制数据库的方法:

create database new_database;
create table new_database.table_one select * from source_database.table_one;
create table new_database.table_two select * from source_database.table_two;
create table new_database.table_three select * from source_database.table_three;
...

我刚刚做了一个性能测试,在 700 万个表行中复制 750MB 数据需要 81 秒。大概你的数据库比那个小?

我认为您不会更快地找到任何东西。您可以做的一件事是已经有一个备用数据库队列,随时可以提取和使用。因此,您根本不需要创建新数据库,只需从可用数据库队列中重命名现有数据库即可。并运行一个 cron 作业以确保队列永远不会为空。

【讨论】:

    【解决方案2】:

    为什么 mysql 无法读取或您在表列表中更改了什么?

    我觉得可能是mysql读取权限有问题,不然就好了..

    谢谢

    【讨论】:

    • 不幸的是,它不能那样工作。请记住,我正在尝试复制 1 个单个数据库,而不是整个数据库服务器,所以我只复制了文件,但是 mysql 还会在其他无法轻松复制的地方存储数据库的表名列表等。
    • 这只有在你拥有所有 myisam 表的情况下才有可能......然后只需简单地在新数据库文件夹中的所有 myisam 表文件。
    • 不幸的是,我们在这种情况下使用的是 innodb :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多