使用数据传输服务(DTS)将本地数据库迁移到RDS,可以实现应用不停服务的情况下,平滑完成数据库的迁移工作。
DTS 数据迁移支持 MySQL 的结构迁移、全量迁移和增量迁移。
1、结构迁移
DTS 会将本地数据库的结构定义迁移到目标实例。目前 DTS 支持结构迁移的对象有:表、视图、触发器、存储过程、存储函数
2、全量迁移
DTS 会将本地数据库迁移对象的数据全部迁移到目标实例。如果用户还选择了增量迁移,那么全量迁移过程中,为了保证数据一致性,无主键的非事务表会被锁定,锁定期间这些表无法写入,锁定时长依赖于这些表的数据量大小,在这些无主键非事务表迁移完成后,锁才会释放。
3、增量迁移
增量迁移会将迁移过程进行数据变更同步到目标实例,如果迁移期间进行了 DDL 操作,那么这些结构变更不会迁移到目标实例。
将本地数据库迁移到 RDS 上有以下限制。
迁移过程中,不支持 DDL 操作
结构迁移不支持 event 的迁移
如果使用了对象名映射功能后,依赖这个对象的其他对象可能迁移失败
当选择增量迁移时,本地 MySQL 实例需要开启 binlog,且本地库的 binlog_format 要为 row。如果本地 MySQL 为5.6版本时,它的 binlog_row_image 还须设置为 full
已完成 RDS 实例数据库的准备,可参见 设置连接模式 和 创建数据库和帐号。
本例以有公网 IP 的本地数据库迁移到 RDS 上为例。
在正式迁移之前,需要先在本地数据库和 RDS 实例中创建迁移帐号,并在 RDS 实例中创建要迁移的数据库,并将要迁移的数据库的读写权限授权给迁移帐号。不同的迁移类型需要不同的权限,如下表所示。
迁移类型 |
结构迁移 |
全量迁移 |
增量迁移 |
本地数据库 |
Select |
select |
select |
RDS 实例 |
读写权限 |
读写权限 |
读写权限 |
1. 在本地数据库中创建迁移帐号。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
参数说明:
l username:要创建的帐号
l host:指定该帐号登录数据库的主机。如果是本地用户可以使用 localhost,如果想让该用户从任意主机登录,可以使用通配符 %
l password:该帐号的登录密码
例:
要创建帐号为 William,密码为 Changme123 的帐号从任意主机登录本地数据库,命令如下:
CREATE USER 'William'@'%' IDENTIFIED BY 'Changme123';
2. 在本地数据库中给迁移帐号授权,本地数据库中迁移帐号的权限要求请参见上表。
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
参数说明:
l privileges:该帐号的操作权限,如 SELECT、INSERT、UPDATE 等。如果要授权该帐号所有权限,则使用 ALL
l databasename:数据库名。如果要授权该帐号所有的数据库权限,则使用通配符 *
l tablename:表名。如果要授权该帐号所有的表权限,则使用通配符 *
l username:要授权的帐号名
l host:授权登录数据库的主机名。如果是本地用户可以使用 localhost,如果想让该用户从任意主机登录,可以使用通配符 %
l WITH GRANT OPTION:授权该帐号能使用GRANT命令,该参数为可选。
例:
授权帐号 William 对所有数据库和表的所有权限,并可以从任意主机登录本地数据库,命令如下:
GRANT ALL ON *.* TO 'William'@'%';
说明:
如果需要进行增量迁移,那么需要确认本地数据库的 binlog 是否开启并正确设置,执行以下步骤。
3. 开启本地数据库的 binlog。 使用如下命令查询是否开启了binlog。
show global variables like "log_bin";
如果查询结果为 log_bin=OFF,那么本地数据库没有开启 binlog。为了使迁移过程中产生的增量数据能同步迁移,需要修改配置文件 my.cnf 中的如下参数。
log_bin=mysql_bin
binlog_format=row
server_id=大于 1 的整数
binlog_row_image=full //当本地 MySQL 版本大于 5.6 时,则需设置该项
4. 修改完成后,重启 MySQL 进程。
$mysql_dir/bin/mysqladmin -u root -p shutdown
$mysql_dir/bin/safe_mysqld &
其中,“mysql_dir”为MySQL安装目录。
数据准备完毕后,即可进入正式的迁移操作。
在 RDS 管理控制台 上单击 迁移数据库,进入 DTS,如下图所示。
单击 创建在线迁移任务,进入 创建迁移任务 页面,如下图所示。
3、输入任务名称、本地数据库信息和目标数据库信息,单击 授权白名单并进入下一步,如下图示。
l 任务名称:自定义任务名称,可以保持默认值
l 源库信息
实例类型:本地数据库的实例类型,可以选择 有公网IP的自建数据库、ECS上的自建数据库、RDS实例、云数据库MongoDB
数据库类型:本地数据库的类型,可以选择 Oracle、MySQL、SQLServer、PostgreSQL、MongoDB
主机名或 IP 地址:本地数据库的公网地址
端口:本地数据库的公网端口
帐号:本地数据库的迁移帐号
密码:本地数据库迁移帐号对应的密码
l 目标库信息
实例类型:默认为 RDS 实例
RDS 实例 ID:目标 RDS 实例的 ID。点击下拉菜单将自动联想当前登录 RDS 管理控制台 的帐号的 RDS 实例,点击选择所需要的实例
帐号:目标 RDS 数据库的迁移帐号
密码:目标 RDS 数据库迁移帐号对应的密码
1. 选择迁移类型,并在 迁移对象 中选择要迁移的对象,单击 > 将要迁移的对象放入 已选择中,单击 预检查并启动,如下图所示。
注意
数据迁移只会将本地数据库的数据(结构)复制一份到目标数据库,并不会对本地数据库数据(结构)造成影响
数据迁移过程中,不支持 DDL 操作,如进行 DDL 操作可能导致迁移失败
DTS 增量迁移的时间最长支持 15 天,如果超过 15 天不停止任务,系统资源可能被回收
如果要修改迁移对象在目标数据库上的名字,可以在 已选择 列表右侧单击 编辑,修改已选择的对象名称,如上图4所示。
说明:
以下以预检查不通过为例进行描述,如果预检查通过,请直接参见步骤 8。
5. 系统显示预检查结果,如下图所示。
6、 单击 检测结果 为 失败 的检测项后的!,查看失败详细信息,根据失败详细信息完成错误排查。
7、错误排查完毕后,在 迁移任务列表 页面,选择当前迁移任务,单击 启动,如下图所示。
8、 系统预检查通过后,单击 确定,自动进行迁移任务,如下图所示。
因迁移帐号拥有读写权限,为了保证本地数据库安全,请在数据迁移完成后,删除本地数据库和 RDS 实例中的迁移帐号。
使用 mysqldump 工具的优点是简单易用、容易上手,缺点是停机时间较长,因此它适用于数据量不大,或者允许停机的时间较长的情况。
由于 RDS 提供的关系型数据库服务与原生的数据库服务完全兼容,所以对用户来说,将原有数据库迁移到 RDS 实例的过程,与从一个 MySQL 服务器迁移到另外一台 MySQL 服务器的过程基本类似。
l 已完成 RDS 实例数据库的准备,可参见 设置连接模式 和 创建数据库和帐号。
l 已购买云服务器 ECS。
1. 关闭 MySQL 进程。
$mysql_dir/bin/mysqladmin -u root -p shutdown
其中,mysql_dir 为MySQL安装目录。
2. 使用 mysqldump 的数据导出工具,将本地数据库数据导出为数据文件。
说明: 本步骤仅仅导出数据,不包括存储过程、触发器及函数。
mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName --skip-triggers > /tmp/dbName.sql
参数说明:
l localIp:本地数据库服务器 IP 地址
l userName:本地数据库的迁移帐号
l dbName:需要迁移的数据库名
l /tmp/dbName.sql:备份生成的文件名
3. 使用 mysqldump 导出存储过程、触发器和函数。
说明: 若数据库中没有使用存储过程、触发器和函数,可跳过此步骤。在导出存储过程、触发器和函数时,需要将 definer 去掉,以兼容 RDS。
mysqldump -h localIp -u userName -p --opt --default-character-set=utf8 --hex-blob dbName -R | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > /tmp/triggerProcedure.sql
参数说明:
l localIp:本地数据库服务器 IP 地址
l userName:本地数据库的迁移帐号
l dbName:需要迁移的数据库名
l /tmp/triggerProcedure.sql:备份生成的文件名
4. 参见 ECS 产品文档,将数据文件和存储过程文件上传到 ECS 上。
本例以文件上传到如下路径为例。
/tmp/dbName.sql
/tmp/triggerProcedure.sql
5. 登录 ECS,将数据文件和存储过程文件导入到目标 RDS 中。
mysql -h intranet4example.mysql.rds.aliyuncs.com –u userName -p dbName < /tmp/dbName.sql
mysql -h intranet4example.mysql.rds.aliyuncs.com -u userName -p dbName < /tmp/triggerProcedure.sql
参数说明:
l intranet4example.mysql.rds.aliyuncs.com:RDS 实例连接地址,本例以内网地址为例
l userName:RDS 数据库的迁移帐号
l dbName:需要导入的数据库名
l /tmp/dbName.sql:要导入的数据文件名
l /tmp/triggerProcedure.sql:要导入的存储过程文件名
使用数据传输服务 (DTS) 将本地数据库迁移到 RDS,可以实现应用不停服务的情况下,平滑完成数据库的迁移工作。
DTS 支持 SQL Server 数据结构迁移和全量迁移。
l 结构迁移
DTS 会将本地数据库的结构定义迁移到目标实例。目前DTS支持结构迁移的对象有:表、视图、表触发器、同义词、SQL 存储过程、SQL 函数、自定义类型、plan guid、rule、default。
l 全量迁移
DTS 会将本地数据库迁移对象的数据全部迁移到目标实例。如果在迁移过程中有增量更新的话,这些增量不会被迁移到目标库。所以建议在业务无写入时,使用 DTS 进行全量数据迁移。
将本地数据库迁移到 RDS 上有以下限制:
l 迁移过程中,不支持 DDL 操作
l 结构迁移不支持 assemblies、库级存储过程、service broker、全文索引、全文目录、分布式 schema、分布式函数、CLR 标量函数、CLR 标值函数、内部表、聚合函数和系统的迁移
l 如果使用了对象名映射功能后,依赖这个对象的其他对象可能迁移失败
已完成 RDS 实例数据库的准备,可参见 设置连接模式 和 创建数据库和帐号。
本例以有公网 IP 的本地数据库迁移到 RDS 上为例。
在正式迁移之前,需要先在本地数据库和RDS实例中创建迁移帐号,并在RDS实例中创建要迁移的数据库,并将要迁移的数据库的读写权限授权给迁移帐号。不同的迁移类型需要不同的权限,如下表所示。
迁移类型 |
结构迁移 |
全量迁移 |
本地数据库 |
select |
Select |
RDS 实例 |
读写权限 |
读写权限 |
1. 在本地数据库中创建迁移帐号。
create login username with password='password', default_database=mydb;
go
create user username for login username with default_schema=dbo;
go
参数说明:
username:要创建的帐号
password:该帐号的登录密码
mydb:默认连接的数据库
dbo:默认的数据表
例:
要创建帐号为 William,密码为 Changme123 的帐号访问数据 mydb 的数据表 dbo,命令如下:
create login William with password='Changme123', default_database=mydb;
go
create user William for login William with default_schema=dbo;
go
2. 在本地数据库中给迁移帐号授权,本地数据库中迁移帐号的权限要求请参见上表。
GRANT privileges ON tablename TO username WITH GRANT OPTION;
参数说明:
privileges:该帐号的操作权限,如 SELECT、INSERT、UPDATE 等。如果要授权该帐号所有权限,则使用 ALL
tablename:表名。如果要授权该帐号所有的表权限,则使用通配符 *
username:要授权的帐号名
WITH GRANT OPTION:授权该帐号能使用GRANT命令,该参数为可选
例:
授权帐号 William 对所有数据库和表的所有权限,命令如下:
GRANT ALL ON * TO William;
在 RDS 管理控制台 上单击 迁移数据库,进入DTS,如下图所示。
单击 创建在线迁移任务,进入 创建迁移任务 页面,如下图所示。
3. 输入任务名称、本地数据库信息和目标数据库信息,单击 授权白名单并进入下一步,如下图所示。
任务名称:自定义任务名称,可以保持默认值
源库信息
实例类型:本地数据库的实例类型,可以选择 有公网 IP 的自建数据库、ECS 上的自建数据库、RDS 实例、云数据库 MongoDB
数据库类型:本地数据库的类型,可以选择 Oracle、MySQL、SQLServer、PostgreSQL、MongoDB
主机名或IP地址:本地数据库的公网地址
端口:本地数据库的公网端口
帐号:本地数据库的迁移帐号
密码:本地数据库迁移帐号对应的密码
目标库信息
实例类型:默认为 RDS 实例
RDS实例ID:目标 RDS 实例的 ID。点击下拉菜单将自动联想当前登录管理控制台的帐号的 RDS 实例,点击选择所需要的实例
数据库名称:要迁移到目标数据库的名称
帐号:目标 RDS 数据库的迁移帐号
密码:目标 RDS 数据库迁移帐号对应的密码
4. 选择迁移类型,并在 迁移对象 中选择要迁移的对象,单击 > 将要迁移的对象放入 已选择 中,单击 预检查并启动,如下图所示。
注意
数据迁移只会将本地数据库的数据(结构)复制一份到目标数据库,并不会对本地数据库数据(结构)造成影响
数据迁移过程中,不支持DDL操作,如进行DDL操作可能导致迁移失败
DTS增量迁移的时间最长支持15天,如果超过15天不停止任务,系统资源可能被回收
如果要修改迁移对象在目标数据库上的名字,可以在 已选择 列表右侧单击 编辑 ,修改已选择的对象名称,如上图中4所示。
说明:
以下以预检查不通过为例进行描述,如果预检查通过,请直接参见步骤 8。
5. 系统显示预检查结果,如下图所示。
6. 单击 检测结果 为 失败 的检测项后的 !,查看失败详细信息,根据失败详细信息完成错误排查。
7、错误排查完毕后,在 迁移任务列表 页面,选择当前迁移任务,单击 启动,如下图所示。
8. 系统预检查通过后,单击 确定,自动进行迁移任务,如下图所示。
为了保证本地数据库安全,请在数据迁移完成后,删除本地数据库和 RDS 实例中的迁移帐号。
阿里云数据库 SQL Server 版导入数据有如下限制:
仅支持导入 SQL Server 2005、SQL Server 2008、SQL Server 2008R2 版本数据
仅支持全量数据导入
数据库的 Recover Mode 必须是 FULL 模式
已创建目标实例和数据库
如果数据库里有数据,请做好备份,目标数据库中的数据将被覆盖
为了确保数据一致性,请停止本地数据库的写入操作
准备好 Filezilla 3.6.0.2 客户端 软件,请注意软件版本,且安装后请不要升级版本
1. 执行如下命令,检查本地数据库的 Recover Mode。
use master;
go
select name, case recovery_model
when 1 then 'FULL'
when 2 then 'BULD_LOGGED'
when 3 then 'SIMPLE' end model from sys.databases
where name not in ('master','tempdb','model','msdb');
go
确认本地数据库的 model 值:
l 如果 model 值不为 FULL,请执行步骤 2。
l 如果 model 值为 FULL,请执行步骤 3。
2. 执行如下命令,设置源数据库的 Recover Mode 为 FULL。 注意: Recover Mode 改成 FULL 模式会导致 SQL Server 日志增加,请注意有足够的硬盘空间。
ALTER DATABASE [dbname] SET RECOVERY FULL;
go
ALTER DATABASE [dbname] SET AUTO_CLOSE OFF;
go
3. 备份源数据库,本例以备份文件名为 filename.bak 为例。
use master;
go
BACKUP DATABASE [testdbdb] to disk ='d:\backup\filename.bak' WITH COMPRESSION,INIT;
go
4. 还原源数据库的 Recover Mode。
说明: 如果您未执行步骤 2,即数据库 Recover Mode 原为 FULL,则无需执行该步骤。
ALTER DATABASE [dbname] SET RECOVERY SIMPLE;
go
1. 登录 RDS 管理控制台,选择目标实例。
2. 在菜单中选择 数据库管理。
3. 在 数据库管理 页面单击 备份文件(bak)迁入,如下图所示。
4、在 数据导入向导 页面的 备份你的数据库 步骤确认已参照 备份本地数据 备份好本地数据库后,单击 下一步,如下图所示。
5、 在 上传备份文件 步骤单击 获取 FTP 信息,获取备份文件上传 FTP 信息,如下图所示。
6. 将本地数据库备份文件名更改为上一步骤中获取的文件名。 注意: 本地备份文件名必须更改为上一步骤中提供的文件名,否则备份文件无法上传成功。
7. 打开 FileZilla 软件,选择 文件 > 站点管理器。
8. 单击 新站点,创建并命名新站点后,按步骤 5 中获取的 FTP 信息填写站点信息,如下图所示。
主机:FTP 信息中的 外网服务器
端口:FTP 信息中的 外网服务器端口
加密:选择 要求隐式的 FTP over TLS
登录类型:选择 正常
用户:FTP 信息中的 FTP 帐号
密码:FTP 信息中的 FTP 密码
9. 选择 传输设置 页签,设置 传输模式 为 被动,单击 连接,如下图所示。 说明: 系统会弹出 未知证书 提示,单击 确定 即可。
10. 连接 FTP 服务器后,将备份文件按步骤 5 中提供的文件名更名后,上传至 FTP 服务器。
11. 返回 RDS 管理控制台 的 数据导入向导,单击 下一步 进入 数据导入 步骤。
12. 确认 FTP 上传完成,且文件大小无误后,单击 数据导入,在弹出的确认框中单击 确定,如下图所示。
注意:
如果导入残缺或者非法文件,导入会失败,该实例控制台将一直处于恢复中状态,请提交工单解除该状态。
如果导入数据后,实例磁盘容量超过总使用量的 85%,则无法进行导入。请先删减实例的数据或扩展磁盘容量。
13. 数据导入完成后,单击 关闭,结束数据导入。
本地数据导入阿里云后,您可以在菜单中选择 备份文件迁入记录,查看数据导入记录,执行 数据导入 操作。
使用数据传输服务可以轻松得将本地的PostgreSQL迁移至RDS PostgreSQL,目前数据传输服务可以支持PostgreSQL的结构迁移及全量数据迁移。
l 结构迁移
数据传输服务会将迁移对象的结构定义迁移到目标实例。对于PostgreSQL,数据传输服务支持结构迁移的对象有:Table、trigger、view、sequence、function、user defined type、rule、domain、operation、aggregate
l 全量迁移
数据传输服务会将源数据库迁移对象在的数据全部迁移到目标实例。为了保证迁移数据一致性,建议在迁移过程中,源数据库停止业务写入。如果在迁移过程中 ,源数据库有业务写入的话,那么全量迁移后,源跟目标库数据可能不一致
l 源实例,支持PostgreSQL 9.2、9.3、9.4
l 迁移过程中,不支持DDL操作
l 不支持迁移使用C语言编写的function
l 如果使用了对象名映射功能后,依赖这个对象的其他对象可能迁移失败
当使用数据传输服务进行PostgreSQL迁移时,在不同迁移类型情况下,源跟目标数据库的迁移帐号权限要求如下:
迁移类型 |
结构迁移 |
全量迁移 |
本地PostgreSQL实例 |
pg_catalog的usage权限 |
迁移对象的select |
目的RDS实例 |
迁移对象的create、usage权限 |
schema的owner |
数据传输服务在进行PostgreSQL->RDS For PostgreSQL数据迁移时,为了解决对象间的依赖,提高迁移成功率。结构对象及数据的迁移顺序如下:
(1) 进行结构对象:Table、view、sequence、function、user defined type、rule、domain、operation、aggregate的迁移
(2) 全量数据迁移
(3) 进行结构对象:trigger、foreign key的迁移
全量数据迁移完成后,任务列表中的迁移进度如下图,结构迁移100%,全量迁移100%,但是迁移状态为“迁移中”,此时迁移任务正在进行步骤(3)中的对象的迁移。此时,请勿直接结束任务,否则会造成迁移对象丢失。
下面详细介绍下用户如何使用数据传输服务将本地的PostgreSQL迁移到RDS上的流程
在正式迁移之前,需要确认目标RDS实例中是否已经创建好了需要迁入的数据库,如果没有创建的话,需要先创建迁入数据库。
在正式迁移之前,需要先在本地PostgreSQL数据库及云上RDS实例中创建迁移帐号,并将要迁移的库表的相应权限授权给上面创建的帐号。
当上面的所有前提条件都配置完成后,就可以开始正式的数据迁移了。下面详细介绍下具体的迁移步骤。
1. 进入DTS控制台,点击创建迁移任务,正式开始任务创建
2. 填写本地PostgreSQL跟目标RDS实例的连接信息
这里面源实例类型要选择有公网IP的自建数据库。
源实例需要填写如下几个内容:
实例类型: 实例类型需要选择有公网IP的自建数据库
数据库类型: 数据库类型需要选择PostgreSQL
主机名或IP地址: 数据库服务安装服务器的IP或实例的连接串地址
端口: 数据库监听端口号
数据库名称: 需要迁移对象所属数据库
账号: 数据库连接账号
密码: 数据库连接账号对应的密码
目标实例需要填写如下几个内容:
RDS实例ID: 需要迁入数据的RDS实例ID
数据库名称: 需要迁入对象所属的数据库
账号: 数据库连接账号
密码: 数据库连接账号对应的密码
3. 选择迁移对象及迁移类型
默认情况下,迁移对象迁移到目标库后,对象名跟源库一致。如果目标库对象名同源库不同,那么可以使用数据传输服务提供的对象名映射功能。
对于需要映射的对象,将鼠标挪到已选择对象框中,对应对象行上,右边会出现“编辑”按钮,点击编辑进入对象编辑页面,既可以修改对象名。
当点击编辑后,即进入对象名称修改页面:
修改了对象名后,目标实例要导入数据的对象名称即为修改后的对象名。
这里面只是简单介绍了配置对象映射的流程,详细操作方式详见数据迁移手册中的库表列映射。
数据传输服务同时还支持迁移数据过滤,具体使用方式详见数据迁移手册中的配置SQL条件过滤数据。
4. 启动预检查
在数据正式迁移之前,会先进行基础预检查,只有预检查通过后,才能启动迁移
如果预检查失败,那么可以查看具体的失败详情,根据失败原因修复后,重新进行预检查
当点击查看后,可以查看到具体的预检查失败原因:
当修复完成后,可以在任务列表中,选择这个任务,然后重新启动任务
5. 启动迁移任务
当预检查通过后,我们可以启动迁移任务,任务启动后,可以到任务列表中查看具体的迁移状态及进度
至此,完成将本地PostgreSQL数据库移到RDS的数据迁移任务配置。
本例介绍通过 psql 命令将 PostgreSQL 数据备份文件恢复到目标 RDS中。
PostgreSQL 支持逻辑备份。我们使用 pg_dump 逻辑备份功能,导出备份文件,再通过 psql 导入到 RDS 中,实现将 PostgreSQL 的数据导入到 RDS 中。
已完成 RDS 实例数据库的准备,可参见 设置连接模式 和 创建数据库和帐号。
1. 通过 PostgreSQL 客户端,连接本地 PostgreSQL 数据库。
2. 执行如下命令,备份数据。
pg_dump -U username -h hostname -p port databasename -f filename
参数说明如下:
username:本地数据库用户名
hostname:本地数据库主机名,如果是在本地数据库主机登录,可以使用 localhost
port:本地数据库端口号
databasename:要备份的本地数据库名
filename:要生成的备份文件名称
例如,数据库用户 William 要备份本地 PostgreSQL 数据库,登录 PostgreSQL 主机后,通过如下命令备份数据。
pg_dump -U William -h localhost -p 3433 pg001 -f pg001.sql
说明:
通过 RDS 内网恢复数据,网络更稳定,数据更安全。建议您通过将数据上传到云服务器 ECS 上,然后通过内网将数据恢复到目标 RDS上。如果数据文件太大,可以先压缩后再上传。本例以该方式为例进行说明。
1. 登录云服务器 ECS
2. 通过 PostgreSQL 客户端,执行如下命令将数据导入到 RDS 中。
psql -U username -h hostname -d desintationdb -p port -f dumpfilename.sql
参数说明如下:
username:RDS 上的 PostgreSQL 数据库用户名
hostname:RDS 上的 PostgreSQL 数据库地址
port:RDS 上的 PostgreSQL 数据库端口号
databasename:RDS 上的 PostgreSQL 数据库名
filename:本地备份数据文件名
例如:
psql -U William -h postgresql.rds.aliyuncs.com -d pg001 -p 3433 -f pg001.sql
由于 RDS 数据库的权限设置和本地数据库不一致,在数据导入过程当中可能会出现一些与权限相关的 WARNING 或 ERROR,可以忽略,如:
WARNING: no privileges could be revoked for "xxxxx"
ERROR: role "xxxxx" does not exist
使用数据传输服务(DTS)将本地数据库迁移到 RDS,可以实现应用不停服务的情况下,平滑完成数据库的迁移工作。迁移过程中,对本地的 Oracle 数据库没有影响。
DTS 数据迁移支持 PPAS 的结构迁移和全量迁移。
结构迁移
DTS 会将迁移对象的结构定义迁移到目标实例。目前 DTS 支持结构迁移的对象有:表、视图、同义词、触发器、存储过程、存储函数、包、自定义类型。
全量迁移
DTS 会将本地数据库迁移对象的数据全部迁移到目标实例。如果迁移过程中,本地 Oracle 数据库有数据写入的话,那么这些增量数据不一定能够被迁移到 RDS 中。所以,如果要保证数据一致性,那么尽量选择在业务低峰期进行全量迁移。
将 PPAS 本地数据库迁移到 RDS 上有以下限制。
迁移过程中,不支持 DDL 操作
不支持物化视图的迁移
结构迁移时,会将 reverse index 迁移成普通索引
结构迁移时,会将位图索引迁移成普通索引
结构迁移时,会将分区索引迁移成在每个分区上单独创建的索引
已完成 RDS 实例数据库的准备,可参见 设置连接模式 和 创建数据库和帐号。
本例以有公网 IP 的本地数据库迁移到 RDS 上为例。
在正式迁移之前,需要先在本地数据库和 RDS 实例中创建迁移帐号,并在 RDS 实例中创建要迁移的数据库,并将要迁移的数据库的读写权限授权给迁移帐号。不同的迁移类型需要不同的权限,如下表所示。
迁移类型 |
结构迁移 |
全量迁移 |
本地 Oracle 实例 |
schema 的 owner |
schema 的 owner |
RDS 上 PPAS 实例 |
schema 的 owner |
schema 的 owner |
1ï¼Â 通过 PostgreSQL 客户端,在本地数据库中创建迁移帐号。
CREATE USER username IDENTIFIED BY password;
参数说明:
l username:要创建的帐号
l password:该帐号的登录密码
例如:
CREATE USER myuser IDENTIFIED BY mypassword;
2. 在本地数据库中给迁移帐号授权,本地数据库中迁移帐号的权限要求请参见上表。
GRANT privileges ON tablename TO username;
参数说明:
l privileges:该帐号的操作权限,如 SELECT、INSERT、UPDATE 等。如果要授权该帐号所有权限,则使用 ALL
l tablename:表名。如果要授权该帐号所有的表权限,则使用通配符 *
l username:要授权的帐号名
例如:
GRANT ALL ON * TO myuser;
1. 在 RDS 管理控制台 上单击 迁移数据库,进入 DTS,如下图所示。
2. 单击 创建在线迁移任务,进入 创建迁移任务 页面,如下图所示。