SmxCde
SmxCde

Reputation: 5403

Amazon RDS: Restore snapshot to existing instance

I have created a snapshot of my instance and made some unwanted changes in DB.

Now I want to restore my instance from this snapshot.

When I try to do it - it creates me one more instance, additionally to the one I have.

I specify "DB Instance Identifier" and after that I get two instances with the same ID.

So my question: Is there any way to restore snapshot to existing instance?

Because in other case - new instance is created with differrent endpoint (hostname) and I need to change my configs to access database. Or there is a better way to manage such cases?

Upvotes: 133

Views: 93416

Answers (8)

niksya
niksya

Reputation: 291

Quite late to answer, but while researching I found a way to avoid any application level changes. As Suggested already there is no option to import snapshot to existing RDS. A probable solution :

One time effort

  1. Create a private domain in route 53 [Resolves within your VPC].
  2. Use domain/subdoamin to point your RDS instance.
  3. Use pointed domain/subdomain in your application.

Everytime you restore a snapshot

  1. Create a new RDS instance using snapshot.
  2. Point domain/subdomain to new RDS instance.
  3. Delete older instance at your convenience.

Upvotes: 0

DmitrySemenov
DmitrySemenov

Reputation: 10305

Solution if you want to run through AWS CLI. Replace ORIG_NAME and NEW_NAME with your values

$ aws rds modify-db-instance \
    --db-instance-identifier ORIG_NAME \
    --new-db-instance-identifier NEW_NAME \
    --apply-immediately

$ aws rds restore-db-instance-to-point-in-time \
    --source-db-instance-identifier NEW_NAME \
    --target-db-instance ORIG_NAME \
    --restore-time 2020-08-27T00:00:00.000Z \
    --publicly-accessible \
    --availability-zone us-east-2a \
    --db-subnet-group-name SUBNET_NAME \
    --vpc-security-group-ids SG_ID

  • If you don't have a custom VPC, you can skip --db-subnet-group-name
  • If you don't have a custom security group for your RDS, you can skip --vpc-security-group-ids
  • If you don't need public access to your instance skip --publicly-accessible

So a short version of the aws rds restore-db-instance-to-point-in-time then would be:

$ aws rds restore-db-instance-to-point-in-time \
    --source-db-instance-identifier NEW_NAME \
    --target-db-instance ORIG_NAME \
    --restore-time 2020-08-27T00:00:00.000Z

Upvotes: 2

Franky
Franky

Reputation: 7

After you created the restored db with a new name you can rename the current instance to ...-old, this also renames the db url. After the url is also changed, you have to rename the restored db to the befored used name, wait until the url of the db changes. Then you have to restart your services, and they will connect to the restored db.

This causes no outage at all.

Upvotes: -2

cjuroz
cjuroz

Reputation: 163

As @MaXimus said (I cannot add comments yet) you can:

  1. rename original instance first
  2. restore from snapshot and assign original instance name

As it's specified in Renaming to Replace an Existing DB Instance here: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_RenameInstance.html

Upvotes: 3

MaXimus
MaXimus

Reputation: 557

Rename original instance and name new instance with original name

https://aws.amazon.com/blogs/aws/endpoint-renaming-for-amazon-rds/

Upvotes: 44

Katti
Katti

Reputation: 2121

If anyone came here (just like me) to just restore data without altering your configuration.

Here are the steps :

  • Create a new instance(temp) from your automatic snapshots or manually created ones.
  • Connect to this instance from either Sequel pro or Mysql workbench.
  • Take SQL dump of whatever data you needed from this temp instance.
  • Connect your production instance and restore it.
  • Now delete the temp instance you created.

Upvotes: 80

jack.chen.job
jack.chen.job

Reputation: 329

I had the same issue today. I think you have two options without changing the application's configuration setting.

  1. delete the old instance as Mike suggested, then restore it.

  2. rename the old instance first ( need to check "Apply immediately" option when rename it).

Upvotes: 15

Naveen Vijay
Naveen Vijay

Reputation: 16482

No you can't restore back your existing DB instance to any of the either manual backup or point-in-time snapshot.

The only way you can make use of the manual backup or automated snapshot is to create a new RDS DB instance using that. Once the new DB instance is created, you can change the endpoint of DB in your app / code and delete the old DB instance.

Bottomline : You have to change the config settings in your app. No other option.

Upvotes: 120

Related Questions