Easily Move Databases with Copy-SqlDatabase

One of the things that people have asked to be implemented for many years is an easy way to copy databases. SSIS has the Copy Database Task, but that has been problematic over time. As a result, while easy, it’s cumbersome to take a backup of a database, copy it to a new instance, and restore it. Or use the detach/copy/attach/attach method.

dbatools gives us a nice, easy Posh command to perform this task: Copy-SqlDatabase. I made a quick test recently to see how this works. Using the –Whatif option, I tried to copy a database from one instance to another on my main computer.

My first attempt didn’t do well.

2016-11-22 10_32_58-powershell

I was thinking there would be a default method, but there isn’t. You must specify using the backup/restore method or the detach/attach method. I decided to try the detach/attach method.

2016-11-22 10_31_08-powershell

As you can see, this looks to detach and then reattach the database, so let’s try it. First, check my QA instance. There is no DBAAdmin database.

2016-11-22 10_31_42-SQLQuery1.sql - localhost_SQL2016.DBAAdmin (PLATO_Steve (67))_ - Microsoft SQL S

This is a small database with just a few procs and tables in it. When I remove the –Whatif option, it works.

2016-11-22 10_31_28-powershell

I saw the green PoSh flash in the middle as the file was copied from one location to the next using the BITS method. When I looked in my SQL2016_qa instance, I saw the database and objects.

2016-11-22 10_31_54-SQLQuery1.sql - localhost_SQL2016.DBAAdmin (PLATO_Steve (67))_ - Microsoft SQL S

All in all, this took about two minute for me to move this database. Certainly that is about the time of a backup, but I did this with one command, and it felt much, much easier.

There was a downside for me. I need to double check this, but I didn’t get the database re-attached at the source, and I had to do that myself. The files were there, just not attached. Perhaps it’s just me, so I’ll retest when I get the chance, but it seems to be a minor bug.

I also tried the backup/restore option here. I had to provide a fileshare, which I chose to be my local D: drive. Note, this has to be provided or a popup will appear. This also has to be \\server\share, not d:

2016-11-22 10_51_03-powershell

This worked, with the new database appearing on my second instance.

2016-11-22 10_50_47-SQLQuery5.sql - localhost_SQL2016.sandbox (PLATO_Steve (63)) - Microsoft SQL Ser

The backup was also removed from my drive:

2016-11-22 10_51_25-EVO850_500 (D_)

Overall, this is handy, and I’ll likely use this as my default method for moving databases between instances.

About way0utwest

Editor, SQLServerCentral
This entry was posted in Blog and tagged , , . Bookmark the permalink.

3 Responses to Easily Move Databases with Copy-SqlDatabase

  1. Cláudio Silva says:

    Hi Steve, thanks for the post.

    Regarding your statement:
    “There was a downside for me. I need to double check this, but I didn’t get the database re-attached at the source, and I had to do that myself. The files were there, just not attached. Perhaps it’s just me, so I’ll retest when I get the chance, but it seems to be a minor bug.”

    You have to use the -Reattach parameter. With that you will see your source database re-attached.

  2. jan jansen says:

    interesting. Does the user needs to have write access to the share or is it the service accounts of both sql server services that needs write access?
    Also can you use this to move a database to a previous sql version
    br

    • Cláudio Silva says:

      Hi Jan,

      The service account is the one that does the backup. So it needs to have access to the share.

      No, you can’t restore/attach a database from a higher version on a lower one.

Comments are closed.