Home > database, RDS > 迁移到RDS应该注意的问题

迁移到RDS应该注意的问题

相信大部分用户在将自己本地的数据库迁移到RDS的时候都会遇到各种各样的问题,这里总结一下在迁移过程中常见的问题,包括将本地数据库(客户数据库)导出成可执行的SQL文件—–>导入到远端的RDS数据库—->测试验证.

案例一:用户迁移到RDS,遇到视图依赖的问题(MSSQL数据库)

用户在将本地数据库(mssql)导出成可执行的sql文件,然后在远处导入到RDS数据库的时候,发现视图依赖的问题而导致部分视图没有导入成功,例如:

视图view_0依赖—->视图view2_dep_view_1;视图view2_dep_view_1依赖—–>视图view_1;视图view_1依赖—–>表data:

那么在导出的脚本中有可能view_1限于data表创建,那么在创建view_1的时候就会抛出找不到data表的错误,导致view_1不会创建成功,那么后面的view_0,view2_dep_view_1也显然不会创建成功;既然问题出现了,现在就要明确的是问题出在那个地方,是出在导出生成脚本的时候没有明确好视图与表,视图与视图之间的依赖关系;那么在mssql的导出工具中是否对应的选项来控制这个依赖关系喃?答案是肯定的,在导出工具中就有一个控制依赖关系的选项配置,而该选项默认是关闭的,所以只需将该选项设置为true就行了:

 案例二:用户迁移到RDS后,由于程序的不兼容导致测试报错;

用户在迁移到RDS后,在跑测试用例的时候发现错误:

从报错的问题来看是用户在执行 execute sp_addextendedproperty 的时候出错, 联系用户将出错的代码发给我们调试一下:

DECLARE @CurrentUser sysname
SELECT @CurrentUser = user_name()
EXECUTE sp_addextendedproperty 'MS_Description', 
   '0 正常 1 特殊处理',
   'user', @CurrentUser, 'table', 't_xxx', 'column', 'status'
GO

我们注意到这里currentuser是获取当前用户,而t_xxx表在dbo架构下(RDS MSSQL的表是存放在dbo下),所以会报:object is invalid,所以这里我们只需要修改一下代码,将currentuser换位dbo即可:

EXECUTE sp_addextendedproperty 'MS_Description', 
   '0 草稿 1 流转中 9 已结束',
   'user', 'dbo', 'table', 't_xxx', 'column', 'runState'
GO
命令能够成功执行;

案例三:用户在导入数据到RDS的时候出现存储过程导入不成功(MYSQL)

用户在使用mysqldump逻辑迁移到rds的过程中,用户数据库中含有存储过程,由于mysqldump在dump存储过程的时候会把存储过程的definer dump出来,那么在迁移到rds过程中,由于用户数据库的definer和rds的用户和ip不一致而导致迁移失败(mysqldump中并没有参数用于过滤definer),报错的错误为:

1227 – Access denied; you need the SUPER privilege for this operation ;

用户的存储过程代码为:

/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 PROCEDURE `sp_xxx`()

所以需要在导出的存储过程脚本中去除definer,变为用户RDS的帐号和数据库的ip:

/*!50003 CREATE*/ /*!50020 DEFINER=`rds_user_name`@`rds_ip`*/ /*!50003 PROCEDURE `sp_xxx`()

或者去掉DEFINER就会默认使用用户导入的帐号和ip:

/*!50003 CREATE*/ /*!50020 */ /*!50003 PROCEDURE `sp_xxx`()

RDS提供了专门的替换脚本供用户下载使用:

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(:config no_ignore_case );
my $replace = undef;
my $delete = undef;
my $help = 0;
GetOptions (
'replace|r=s' => \$replace,
'delete|d' => \$delete,
'help|h' => \$help,
) or help('unrecognized options');
help() if $help;
if ($delete and $replace) {
help( 'you must choose EITHER "delete" OR "replace". Not both');
}
$delete = 1 unless $replace;
while (my $line = ) {
if ($delete) {
$line =~ s{(/\*!\d+ )\s*definer\s*=\s*\S+}{$1}i;
}
elsif ($replace) {
$line =~ s{(/\*!\d+\s+definer\s*=\s*)(\S+)}{$1 $replace}i;
} 
print $line;
}
sub help {
my ($msg) = @_;
if ($msg) {
print "*** $msg\n";
}
print "dump_filter - mysqldump filter \n",
"(C) Giuseppe Maxia, 2009\n",
"removes/changes DEFINER clauses from MySQL dumps\n",
"USAGE: dump_filter [options]\n",
" -d|--delete removes the DEFINER clauses\n",
" -r|--replace=s replaces every DEFINER clause with the \n",
" new value provided\n",
" -h|--help This text\n";
exit(1);
}

使用方法:

处理前:

DELIMITER ;;
/*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 PROCEDURE `sp_xxx`()
BEGIN
select 1;
END */;;
DELIMITER

处理后:

$mysqldump -uroot test --no-data -R  -p | ./dump_filter --delete
DELIMITER ;;
/*!50003 CREATE*/ /*!50020 /*!50003 PROCEDURE `sp_xxx`()
BEGIN
select 1;
END */;;
DELIMITER ;
mysqldump --no-data sakila | dump_filter --replace='newuser@`10.%`' > sakila_secure.sql

这样就可以在用户导出的存储过程中就没有definer,点击这里下载:dump_filter

案例四:用户导入RDS的时候报错(MYSQL:Got a packet bigger than ‘max_allowed_packet’ bytes)

用户在远程连到RDS后,在用source命令进行导入的时候,可能会出现:

Got a packet bigger than ‘max_allowed_packet’ bytes

错误的原因为用户一次插入RDS的数据超过了RDS (mysql)参数max_allowed_packet(默认为16M)的设置,就会抛出该错误,这样的问题解决办法为联系RDS技术人员将该参数调大(RDS现在已经调整该参数到160M)。

Categories: database, RDS Tags:
  1. No comments yet.
  1. No trackbacks yet.
You must be logged in to post a comment.