aws rds mysql查询缓存_AWS RDS 骚操作,备份数据库到 S3,并从 S3 还原数据库

MSSQL 传统备份和还原

备份数据库和备份数据库日志,一般的情况是将备份文件保存到服务器磁盘下的某个路径,然后再将文件复制到多个不同的地方。操作如下:

备份数据库

连接到数据库,打开一个查询窗口,然后执行如下语句:

USE DB_Name;

GO

BACKUP DATABASE DB_Name

TO DISK = 'c:\tmp\DB_Name.bak'

WITH FORMAT,

MEDIANAME = 'SQLServerBackups',

NAME = 'Full Backup of DB_Name';

GO

还原数据库

连接到数据库,打开一个查询窗口,然后执行如下语句:

RESTORE DATABASE DB_Name

FROM DISK = 'c:\tmp\DB_Name.bak' ;

AWS RDS 备份和还原

AWS RDS 提供的是数据库服务,对于终端用户来说,是无法访问到真正的服务器,更不可能像传统数据库备份一样,将数据库备份到服务器本地的具体路径下。

有过这样一个小插曲,曾经听过一个 DBA 告诉我们 "AWS 的 RDS 只能备份整个实例,无法备份单个数据库",由于 DBA 的工作已经从 DevOps 剥离,我就当是一个笑话听了。当时还在内心深处鄙视了一下 RDS。

现在已不同往日,分久必合,合久必分,DBA 的工作又还给了 DevOps。备份整个实例我也忍了,至少它会备份,根本没有精力去研究 DBA 的事情,得过且过。新的问题出现了,数据库要升级,要从 MSSQL Express 和 Web 版本升级到 Standard 版本,这样的升级 RDS 确实没有提供。

整个实例备份还原?

但是就现在的业务来讲,还需要把 Express 和 Web 版本的数据库合并到一个 Standard 版本里面,整个实例备份还原的方式行不通。

使用之前介绍的跨实例迁移数据库?

可行是可行,但是这种方式只能导数据,主键、索引、外键等等,还需要对比原表重建设置,十几个数据库,百十来张表,人工操作太多,很容易出错。

AWS RDS 真的如此矬么,不支持单数据库备份?

什么事情就怕以讹传讹,谣言就是这样来的。先研究一下 AWS RDS 文档再说,谣言就此打住,使用传统备份语句确实无法备份,原因就是上面说过,RDS 是一项数据库服务,我们是无法进入到真正的服务器。

USE DB_Name;

GO

BACKUP DATABASE DB_Name

TO DISK = 'c:\tmp\DB_Name.bak'

WITH FORMAT,

MEDIANAME = 'SQLServerBackups',

NAME = 'Full Backup of DB_Name';

GO

--------------执行结果----------------------------------

Msg 262, Level 14, State 1, Line 3

BACKUP DATABASE permission denied in database 'DB_Name'.

Msg 3013, Level 16, State 1, Line 3

BACKUP DATABASE is terminating abnormally.

AWS RDS 最简单的完全备份还原步骤:

创建 S3 存储桶

数据库实例上选项组中添加 SQLSERVER_BACKUP_RESTORE 选项

执行 RDS 提供的备份语句

创建 S3 存储桶

这里需要注意一个命名的问题,S3 存储桶的名字全球唯一,所以命名的时候最好将区域和账号(不是登录用户,是账号)都带上,这也是现在我们的命名规则:名字-区域-账号。

9e27235e19dc00133a7ca09d398a6ff6.png

配置 SQLSERVER_BACKUP_RESTORE

第一步,创建选项组。请确定确定数据库引擎和主引擎的版本,因为在后面创建选项组的时候需要选项数据库引擎的版本。如果创建的选项组使用的引擎版本和我们要备份数据库引擎版本不一致的话,在 RDS 更新数据库选项组的时候,就找不到新创建的选项组。

查看引擎信息:

588b9ce0010f9dbd0f1ae1bc98d36b11.png

创建选项组:

fafa25071f272d0451f16d8b113bec41.png

74d149316dd6d73db92ec1d8c5a94d9b.png

4599f627dc69248f5c72d96745d2d3c0.png

第二步,添加选项。第一步执行完,只是创建了选项组,还没有把 SQLSERVER_BACKUP_RESTORE 选项添加上。添加选项组需要先选中已经创建的选项组,然后选择添加选项按钮,就可以进入到添加选项界面了。在添加选项的界面,在选项名字的下拉框选择 SQLSERVER_BACKUP_RESTORE (由于我已经添加过,所以这里就看不到了)。在 S3 目标的存储桶位置填入上面创建好的存储桶,根据实际情况填入 S3 前缀(我这里没有填)。在 IAM 角色的位置选择新创建,填入一个有意义的名字(我这里的名字是已经创建好的名字),以便管理和重复使用,如果已经有类似的角色就选择已有的。最后,在正在计划,选择立即。

e56d272f5932b3fb5e249bda9243b365.png

RDS 更新数据库选项组

在 RDS 的数据库界面选中需要修改选项组的实例,然后点击修改按钮。进入到数据库实例修改的界面滑动到数据库选项的位置,在选项组的下拉框中选择上面配置好的选项组,然后选择继续,直到完成。

924d2ba1eccff51ab8711e305643f2bb.png

备份数据库

是时候表演真正的技术了。打开一个新的查询窗口,选择要备份的数据库,或者在查询窗口中使用 use DataBase 语句,然后执行 RDS 提供的备份语句:

exec msdb.dbo.rds_backup_database

@source_db_name='******Data',

@s3_arn_to_backup_to='arn:aws:s3:::database-backup-us-east-1-***/***Data-20200326.bak',

@overwrite_s3_backup_file=1,

@type='FULL';

448d0732947249757fa5a483d8acd1fc.png

备份已经开始了,我们不可能两眼一抹黑的等,RDS 也提供查询状态的语句:

exec msdb.dbo.rds_task_status;

b941d0bab9f5c1e432bcc2d5743e9ab4.png

105e882abee98bff0878848193c8f45b.png

通过上面的语句,已经可以看出来,备份完成了,这个时候去 S3 查看就能看到备份文件了:

834136f8fe692548b2efb6d9365d2cda.png

还原数据库

这个操作也很简答,在需要还原的数据库实例上打开查询窗口,执行还原语句,如果数据库已经存在的话,备份是会失败滴:

exec msdb.dbo.rds_restore_database

@restore_db_name='***Data',

@s3_arn_to_restore_from='arn:aws:s3:::database-backup-us-east-1-***/******Data-20200326.bak';

11b56f623a0abfdf68c15cb055c73163.png

使用和查看备份状态一样的语句,查询还原的进度:

exec msdb.dbo.rds_task_status @task_id = 6;

3d54d1b426ec751df4cf388a9003a827.png

105e882abee98bff0878848193c8f45b.png

总结

这里只是介绍了 msdb.dbo.rds_backup_database 默认的备份 和 msdb.dbo.rds_restore_database默认的还原,里面的参数并没有详细说明。更多的细节可以查看官方文档,以后有时间也会继续更新一些关于 RDS 操作。

作为基于 AWS 的运维已经有三年的时间了,我最大的感触就是,不要相信别人说的,一定要自己亲自去查看文档。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于MySQL数据库备份文件的下载,可以使用Python的boto3库来实现从RDS上下载备份文件。 首先,需要安装boto3库,可以使用pip安装: ``` pip install boto3 ``` 然后,需要在AWS控制台上创建一个IAM用户,并生成该用户的Access Key和Secret Access Key,并将该用户加入RDS的访问策略组中。 接着,可以使用以下Python代码来下载MySQL备份文件: ``` python import boto3 # 配置AWS访问密钥 aws_access_key_id = 'your_access_key_id' aws_secret_access_key = 'your_secret_access_key' # 创建rds client对象 client = boto3.client('rds', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name='your_rds_region') # 获取最近的mysql备份文件 response = client.describe_db_log_files( DBInstanceIdentifier='your_db_instance_id', FilenameContains='mysql', FileLastWritten=0 ) # 下载mysql备份文件 if len(response['DescribeDBLogFiles']) > 0: file = response['DescribeDBLogFiles'][0] filename = file['LogFileName'] download_response = client.download_db_log_file_portion( DBInstanceIdentifier='your_db_instance_id', LogFileName=filename ) with open('mysql_backup.sql', 'wb') as f: f.write(download_response['LogFileData']) ``` 需要将上面代码中的 `your_access_key_id`,`your_secret_access_key`,`your_rds_region`,`your_db_instance_id` 替换成自己的AWS访问密钥、RDS所在区域和实例ID。 这样,就可以通过Python从RDS上下载MySQL备份文件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值