【SQLServer】コマンドラインでデータベースをコピーする

SQLServerでデータベースをコピーする(バックアップする)方法を紹介します。

本記事では、SSMS(SQL Server Management Studio)を使用せず、コマンドラインでバックアップする方法になります。

はじめに

BeforeDatabaseと同じ内容のデータベースAfterDatabaseを作成します。

SQLServerにログイン

まずSQLServerにログインします。コマンドプロンプトを開き、

sqlcmd -S サーバ名 -U ユーザ名 -P パスワード

上記のコマンドのサーバ名、ユーザ名、パスワードは適当変更してください。

>1と表示されれば、ログイン完了です。

SQLServerのデータファイルの場所を確認

SELECT
name, physical_name
FROM sys.master_files
WHERE
database_id = DB_ID()
go

physical_nameに出力されたSQL Serverのデータファイルの場所(ファイル名は除外)をメモしておきます。

具体例

name                           physical_name

----------------------------------------------------------------------------------------------------------------
master                         C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\master.mdf

mastlog                        C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\mastlog.ldf

C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATAをメモする。

既存のデータベースをコピーする

以下のSQL文を実行します。

BACKUP DATABASE ○○
TO DISK = 'メモしたファイルの場所(DATAをBACKUP)\○○.bak'
go

メモしたファイルの場所に○○.bakが作成されました。

具体例

BACKUP DATABASE BeforeDatabase
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\BACKUP\BeforeDatabase.bak'
go

データベースを別名で保存

以下のSQL文を実行します。

RESTORE DATABASE □□
FROM DISK = 'メモしたファイルの場所(DATAをBACKUP)\○○.bak'
WITH
MOVE '○○' TO 'メモしたデータファイルの場所\□□.mdf',
MOVE '○○_log' TO 'メモしたデータファイルの場所\□□_log.ldf'
go

□□は、別名のデータベースになります。

MOVE ‘○○’とMOVE ‘○○_log’は、以下のSQL文を実行し、論理名(logical_name)を確認して代替して実行してください。

RESTORE FILELISTONLY FROM DISK = 'メモしたファイルの場所(DATAをBACKUP)\○○.bak'
go

具体例

RESTORE DATABASE AfterDatabase
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\BACKUP\BeforeDatabase.bak'
WITH
MOVE 'BeforeDatabase' TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AfterDatabase.mdf',
MOVE 'BeforeDatabase_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\BACKUP\AfterDatabase.ldf'
go

これで、BeforeDatabaseと同じ内容のAfterDatabaseを作成できました。