AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 445489
Accepted
Jagbir
Jagbir
Asked: 2012-11-06 03:03:17 +0800 CST2012-11-06 03:03:17 +0800 CST 2012-11-06 03:03:17 +0800 CST

如何有效地转储一个巨大的 MySQL innodb 数据库?

  • 772

我有一个 Ubuntu 10.04 生产 MySQL 数据库服务器,其中数据库的总大小为 260 GB,而根分区的大小本身为 300 GB,其中存储了数据库,基本上意味着大约 96% 的 / 已满并且没有剩余空间用于存储转储/备份等。到目前为止,没有其他磁盘连接到服务器。

我的任务是将此数据库迁移到位于不同数据中心的其他服务器。问题是如何以最少的停机时间有效地做到这一点?

我在想:

  • 请求将额外的驱动器附加到服务器并在该驱动器中进行转储。[编辑:现在不可能。]
  • 将转储传输到新服务器,恢复它并使新服务器成为现有服务器的从属服务器以保持数据同步
  • 当需要迁移时,中断复制,更新从属配置以接受读/写请求并将旧服务器设置为只读,这样它就不会接受任何写请求,并告诉应用程序开发人员使用新的 db IP 地址更新那里的配置。

你有什么建议来改进这个或任何其他更好的方法来完成这个任务?

innodb
  • 4 4 个回答
  • 7693 Views

4 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-11-06T23:01:47+08:002012-11-06T23:01:47+08:00

    如果您正在考虑迁移到另一个具有完全相同版本的 MySQL 的数据库服务器,您可能希望rsync从datadir旧服务器迁移到新服务器。

    无论 InnoDB 文件布局如何,甚至是否存在 MyISAM 表,这都将起作用。

    1. 在 ServerB 上安装与 ServerA 相同版本的 mysql
    2. 在ServerA上,RESET MASTER;在rsycn进程之前运行清除所有二进制日志。如果未启用二进制日志记录,则可以跳过此步骤。
    3. 在 ServerA 上,SET GLOBAL innodb_max_dirty_pages_pct = 0;从 mysql 运行大约 10 分钟(这会从 InnoDB 缓冲池中清除脏页。它还有助于更快地执行 mysql 关闭)如果您的数据库都是 MyISAM,则可以跳过此步骤。
    4. rsync ServerA的/var/lib/mysql到ServerB的/var/lib/mysql
    5. 重复步骤 3,直到 rsync 花费的时间少于 1 分钟
    6. service mysql stop在服务器A上
    7. 再执行一次 rsync
    8. scp ServerA:/etc/my.cnf 到 ServerB:/etc/。
    9. service mysql start服务器B上
    10. service mysql start在 ServerA 上(可选)

    本质上,这是这样的脚本想要的

    mysql -u... -p... -e"RESET MASTER;"
    mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
    RSYNCSTOTRY=10
    cd /var/lib/mysql
    X=0
    while [ ${X} -lt ${RSYNCSTOTRY} ]
    do
        X=`echo ${X}+1|bc`
        rsync -r * targetserver:/var/lib/mysql/.
        sleep 60
    done
    service mysql stop
    rsync -r * targetserver:/var/lib/mysql/.
    service mysql start
    

    DBA StackExchange 的一位成员说我应该远离FLUSH TABLES WITH READ LOCK;基于 mysqlperformanceblog.com 的东西

    我通读并了解到在 a 中间针对 InnoDB 表的 SELECTFLUSH TABLES WITH READ LOCK;仍然允许以某种方式进行写入。正如Arlukin在评论中指出的那样,LVM 可以FLUSH TABLES WITH READ LOCK在 InnoDB 上正常工作(他的评论+1)。

    • http://www.mysqlperformanceblog.com/2012/03/23/how-flush-tables-with-read-lock-works-with-innodb-tables/
    • http://forums.mysql.com/read.php?22,184590,184610

    对于所有非 LVM 用户,您可以使用全 MyISAM 数据库与FLUSH TABLES WITH READ LOCK;. 对于 InnoDB,请坚持--single-tranaction在 mysqldumps 中使用。

    • 9
  2. James Park-Watt
    2012-11-06T03:26:13+08:002012-11-06T03:26:13+08:00

    转储和恢复这种大小的数据库需要数小时。我会,取决于 mysql 的版本,只要版本号增加并且主要修订号没有跳跃。您应该能够获取 /var/lib/mysql 中的原始数据库文件并将它们放在新服务器上,设置权限并使用 --skip-grant-tables 开关启动服务器。为反映新 IP 地址的用户添加必要的授权,然后正常重启。

    我会解决您的数据库的大小,因为它太大而无法提高效率。

    • 1
  3. vagarwal
    2012-11-06T03:56:42+08:002012-11-06T03:56:42+08:00

    您可以按照以下步骤迁移这个庞大的 InnoDB 数据库。

    • 在生产服务器上安装SSHFS并挂载远程服务器的相关分区
    • 使用Percona XtraBackup获取InnoDB数据库的热拷贝,直接保存到SSHFS挂载目录下
    • 此任务将需要几个小时。为了最小化热复制脚本对实时服务器的影响,使用 renice 将其设置为低优先级

      $ renice -n 5 -p <SCRIPT-PID>

    • 确保两台服务器都运行相同版本的 MySQL 服务器。
    • 热复制完成后,您可以在新服务器上恢复它,开始复制过程

    在此过程中您可能会遇到缓慢但绝对不会停机。与 mysqldump 相比,Percona XtraBackup 将创建一个更快且资源消耗更少的热拷贝。这对于一个巨大的 InnoDB 数据库来说是理想的。

    根据使用模式和统计数据,您可以在服务器上的流量最少时运行此过程。也许在周末这样做是个好主意?以上只是大致的过程。您可能需要阅读 Percona XtraBackup 和 SSHFS 文档。

    • 1
  4. Dogsbody
    2012-11-08T06:40:15+08:002012-11-08T06:40:15+08:00

    您可以直接将数据库转储到远程服务器......

    $ mysqldump | ssh user@server 'cat - > dumpfile.sql.gz'
    

    ... SQL 应该压缩得很好,因此您应该使用这些选项之一更快地完成此操作,尽管它也取决于您在框中的 RAM 量 ...

    $ mysqldump | ssh -C user@server 'cat - > dumpfile.sql.gz'
    $ mysqldump | gzip -c | ssh user@server 'cat - > dumpfile.sql.gz'
    
    • 1

相关问题

  • drupal 的 MySQL 配置

  • 奇怪的mysql表问题

  • 以最少的停机时间更改大型 Innodb 表上的列长度

  • 在使用 InnoDB 数据库之前我应该​​知道什么?

  • 如何选择 MySQL 数据库引擎

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve