如何将数据库从一台服务器移动到另一台服务器?

Joh*_*ohn 153 mysql mysqldump backup migration

如何将 MySQL 表从一台物理服务器移动到另一台物理服务器?

例如这个确切的场景: 我有一个使用 innodb 表的 MySQL 服务器,大小约为 20GB。

我想将其移至新服务器,最有效的方法是什么?

Dav*_*all 94

我最喜欢的方法是将 sqldump 命令通过管道传输到 sql 命令。您可以执行所有数据库或特定数据库。所以,例如,

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 
Run Code Online (Sandbox Code Playgroud)

你可以做所有的数据库

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 
Run Code Online (Sandbox Code Playgroud)

唯一的问题是当数据库太大而管道崩溃时。在这种情况下,您可以逐表执行或使用下面提到的任何其他方法。

  • 提示:如果两个数据库都不允许远程连接,请通过“netcat”管道。 (5认同)
  • 为此,我必须在远程服务器上创建一个同名的空数据库,然后将该数据库的名称添加到命令的末尾。 (3认同)

Der*_*ney 73

我最近使用以下策略移动了一个 30GB 的数据库:

旧服务器

  • 停止mysql服务器
  • datadir 的内容复制到磁盘上的另一个位置 ( ~/mysqldata/*)
  • 再次启动mysql服务器(停机时间为10-15分钟)
  • 压缩数据 ( tar -czvf mysqldata.tar.gz ~/mysqldata)
  • 将压缩文件复制到新服务器

新服务器

  • 安装mysql(不要启动)
  • 解压压缩文件 ( tar -xzvf mysqldata.tar.gz)
  • 将 mysqldata 的内容移动到datadir
  • 确保您的 innodb_log_file_size 在新服务器上相同,否则,请不要复制旧日志文件mysql 会生成这些文件
  • 启动mysql

  • @giorgio79 确定,只要您也移动 ibdata 文件。默认情况下,这些位于 datadir 中。MySQL 用户存储在用户表空间中的 mysql 文件夹中。 (3认同)
  • 此过程是否适用于从 Windows 迁移到 Linux? (3认同)
  • @TypoCubeᵀᴹ 抱歉花了两年多的时间来回应,但如果有人明确地说“是的,它可以从 Windows 运行到 Linux”,这会对我有所帮助。就我而言,我从 **Windows Server 2012 R2** 到 **Cent OS (Red Hat 4.8.5-11)**。具体的 mysql 版本是 **Maria DB 10.1**。按照规定,我停止了两个mysql服务,rsync了数据目录,在新服务器上启动mysql服务时,所有数据库、数据库表和数据库用户都完好无损。 (3认同)
  • 压缩/解压缩后跳过复制。使用 ssh 通过网络流式传输 tar,或者(当且仅当在安全的专用网络上读取:*非* 互联网)使用 netcat 来避免加密开销。此外,如果在本地网络上跳过 gzipping,如果您有一个快速的网络管道,您会发现在进行压缩的挂钩核心旋转上传输瓶颈 (2认同)

Rol*_*DBA 34

根据MySQL 5.0 认证学习指南,第 32 章第 32.3.4 节,第 456,457 页描述了二进制可移植性条件,其中包含以下内容:

如果您想要将在一台机器上制作的二进制备份并在具有不同架构的另一台机器上使用它,那么二进制可移植性很重要。例如,使用二进制备份是将数据库从一台 MySQL 服务器复制到另一台的一种方式。

对于 MyISAM,二进制可移植性意味着您可以直接将 MyISAM 表的文件从一台 MySQL 服务器复制到另一台机器上的另一台服务器,第二台服务器将能够访问该表。

对于 InnoDB,二进制可移植性意味着您可以直接将表空间文件从一台机器上的 MySQL 服务器复制到另一台机器上的另一台服务器,第二台服务器将能够访问表空间。默认情况下,服务器管理的所有 InnoDB 表都存储在表空间中,因此表空间的可移植性取决于所有单个 InnoDB 表是否可移植。如果甚至一张表不可移植,那么表空间也不是。

如果满足两个条件,MyISAM 表和 InnoDB 表空间是从一台主机到另一台主机的二进制移植:

  • 两台机器都必须使用二进制补码整数算法
  • 两台机器都必须使用 IEEE 浮点格式,否则表必须不包含浮点列(FLOAT 或 DOUBLE)

实际上,这两个条件几乎没有限制。补码整数运算和 IEEE 浮点格式是现代硬件的规范。InnoDB 二进制可移植性的第三个条件是您应该对表和数据库使用小写名称。这是因为 InnoDB 在 Windows 上以小写形式在内部(在其数据字典中)存储这些名称。使用小写名称允许 Windows 和 Unix 之间的二进制可移植性,要强制使用小写名称,您可以将以下几行放在选项文件中:

[mysqld]
lower_case_table_names=1
Run Code Online (Sandbox Code Playgroud)

如果您将 InnoDB 配置为使用每个表的表空间,二进制可移植性的条件将扩展为包括 InnoDB 表的 .ibd 文件。(共享表空间的条件仍然适用,因为它包含存储有关所有 InnoDB 表的信息的数据字典。)

如果不满足二进制可移植性的条件,您可以将 MyISAM 或 InnoDB 表从一台服务器复制到另一台服务器,方法是使用某种文本格式(例如,使用 mysqldump)将它们转储并将它们重新加载到目标服务器中。

基于存储引擎移动单个表有两种主要方式。

对于给定的示例,我们将假设以下内容:

  1. 数据目录是/var/lib/mysql
  2. 名为mydb 的数据库
  3. mydb数据库中名为mytable 的表。

MyISAM 表

如果 mydb.mytable 使用 MyISAM 存储引擎,则该表将在物理上表现为三个单独的文件

  1. /var/lib/mysql/mydb/mytable.frm(.frm 文件)
  2. /var/lib/mysql/mydb/mytable.MYD(.MYD 文件)
  3. /var/lib/mysql/mydb/mytable.MYI(.MYI 文件)

.frm 包含表结构
.MYD 包含表数据
.MYI 包含表索引页

这些文件相互依赖地用于从 mysql 中的逻辑角度来表示表。由于这些文件没有进一步的逻辑关联,因此将表从一个数据库服务器迁移到另一个数据库服务器。您甚至可以从 Windows 服务器到 Linux 服务器或 MacOS。当然,您可以关闭mysql并复制3个表文件。您可以运行以下命令:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

在一个 ssh 会话中将表保持为只读并保持锁定 24 小时。一秒钟后,在另一个 ssh 会话中执行复制。然后使用 24 小时锁定终止 mysql 会话。您无需等待 24 小时。

InnoDB 表

根据上述认证书中的引述,有许多因素决定了如何备份特定的 InnoDB 表。为简单、清晰和简洁起见,只需使用 --single-transaction 参数执行所需表的 mysqldump 即可获得表的完美时间点转储。如果您只需要一张表,则无需担心 InnoDB 语义。您可以将该转储文件重新加载到您选择的任何 MySQL 服务器。

由于这里合并了两个问题(jcolebrand):编辑

如果您非常愿意忍受一些缓慢的 DB 性能,即使 mysql 仍在 ServerA 上运行,您也可以从旧服务器 (ServerA) 到新服务器 (ServerB) 执行一系列 rsync。

步骤01)在ServerB上安装与ServerA相同版本的mysql

步骤 02) 在 ServerA 上,SET GLOBAL innodb_max_dirty_pages_pct = 0;从 mysql运行大约 10 分钟(这会从 InnoDB 缓冲池中清除脏页。它还有助于更快地执行 mysql 关闭)如果您的数据库都是 MyISAM,则可以跳过此步骤。

步骤 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

步骤 04) 重复步骤 03,直到 rsync 花费不到 1 分钟

步骤 05)service mysql stop在 ServerA 上

步骤 06) 再执行一次 rsync

步骤 07) scp ServerA:/etc/my.cnf ServerB:/etc/

步骤 08)service mysql start在 ServerB 上

步骤 08)service mysql start在 ServerA 上(可选)

试一试 !!!

警告

您可以像这样创建一个复制从站。请记住在主 /etc/my.cnf 中明确设置 server-id 并在从 /etc/my.cnf 中为 server-id 设置不同的数字


Joe*_*Joe 30

如果您正在移动整个数据库架构,您甚至不需要 mysqldump,并且您愿意停止第一个数据库(因此它在传输时保持一致)

  1. 停止数据库(或锁定它)
  2. 转到mysql数据文件所在的目录。
  3. 将文件夹(及其内容)转移到新服务器的 mysql 数据目录
  4. 开始备份数据库
  5. 在新服务器上,发出“创建数据库”命令。
  6. 重新创建用户并授予权限。

我不记得 mysqldump 是处理用户和权限,还是只处理数据……但即使是这样,这也比执行转储并运行它要快得多。如果我需要转储一个 mysql 数据库然后重新插入到其他一些 RDBMS,如果我需要更改存储选项(innodb 与 myisam),或者如果我正在更改 mysql 的主要版本(但是不过,我想我已经在 4 点和 5 点之间完成了)

  • @Joe,是的,`mysqldump` 处理用户和权限,因为它们存储在 `mysql` 模式中。 (4认同)

Sta*_*hns 13

如果您只想移动特定的表,请尝试:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

您可以在同一命令中指定更多的表名称。命令完成后,将 databasename.tablename.sql 文件移动到另一台服务器,然后使用以下命令恢复:

mysql -u username -ppassword databasename < databasename.tablename.sql
Run Code Online (Sandbox Code Playgroud)

注意后面的 .sql 文件是使用mysqldump程序创建的,还原是直接在mysql 中完成的。


poe*_*nca 8

  1. 如果您有 ssh 访问权限,则可以从命令行使用 mysqldump
  2. 如果您没有 ssh 访问权限但您有 phpMyAdmin 访问权限,则可以使用它来导出/导入
  3. 如果您没有 phpMyAdmin 访问权限,则有一些方便的 php 脚本可以转储和导入(但是,根据我自己的经验,我从未找到像 phpMyAdmin 一样可靠的脚本)。

可能有这种可能性,您可以移动实际的数据库文件(对于我的安装,它们位于 /var/lib/mysql ),但我不太确定它将如何运行/解决。


ran*_*omx 5

您将需要休息一下。这将需要一段时间,具体取决于您的网络速度。我将假设您在 Linux/Unix 上运行 MySQL。这是我使用的过程:

  1. 停止源主机上的 mysql 守护进程。
  2. 在目标主机上创建一个 tmp 文件夹以接收文件。
  3. 使用screen制作一个 shell 会话,如果您的 ssh 断开连接,该会话将继续存在。
  4. 使用rsync在主机之间传输文件。类似于:rsync -avhP source user@targethost:/path/to/folder/
  5. 运行您的测试用例以确保您没有在传输中丢失任何东西。

然后像往常一样继续设置本地 MySQL。

*注意:您还可以将 -c 参数与 rsync 一起使用以向传输添加校验和,但是这将根据 CPU 速度而变慢。


小智 5

我可以确认 DTest 的方法也适用于 ubuntu 和 osx 之间的复制。

要复制所有数据库而无需执行任何转储或类似操作:

确保你有一个干净的 mysql mysql(安装了从 mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg下载的 dmg ),那个(非常重要)从未运行过。

将 /var/lib/mysql/ 文件夹内容从 ubuntu 机器复制到 mac 上的 /usr/local/mysql/data/ 内容之上。要访问 ubuntu 机器上的文件夹,我必须使用 sudo 即:

sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder
Run Code Online (Sandbox Code Playgroud)

我使用 scp 复制了文件夹。

在开始之前,请在 mac 上复制 mysql 文件夹,以确保没有搞砸任何事情。

复制文件夹后,在mac机器上进行如下操作:

sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/
Run Code Online (Sandbox Code Playgroud)

首次启动 mysql 服务器(从 System Preferences->mysql 下的首选项窗格)。现在应该正确设置所有用户和数据库。

这适用于 ubuntu 64 位 11.10 上的 mysql 5.1.61 和 osx lion(macbook pro)上的 mysql 5.1.63。