Simple script to backup all SQL Server databases
By: Greg Robidoux | Updated: 2022-07-06 | Comments (281) | Related: 1 | 2 | 3 | 4 | 5 | 6 | More > Backup
Problem
Sometimes things that seem complicated are much easier then you think and this is the power of using T-SQL to take care of repetitive tasks. One of these tasks may be the need to backup all databases on your server. This is not a big deal if you have a handful of databases, but I have seen several servers where there are 100+ databases on the same instance of SQL Server. You could use SQL Server Management Studio to backup the databases or even use Maintenance Plans, but using T-SQL is a much simpler and faster approach.
Solution
With the use of T-SQL you can generate your backup commands and with the use of cursors you can cursor through all of your databases to back them up one by one. You could also use a while loop if you prefer not to use a cursor. This is a very straight forward process and you only need a handful of commands to do this.
How to Backup All SQL Server Databases
- Specify path to store database backups
- Specify backup file name format
- Select list of databases to backup
- Loop through databases
- Programmatically create database backup command using database name, path and file name format
- See attached SQL Server backup script
Database Backup File Name Format DBname_YYYYMMDD.BAK
Here is the script that will allow you to backup each database within your instance of SQL Server. You will need to change the @path to the appropriate backup directory.
-- source: https://www.MSSQLTips.com -- https://www.mssqltips.com/sqlservertip/1070/simple-script-to-backup-all-sql-server-databases/ DECLARE @name NVARCHAR(256) -- database name DECLARE @path NVARCHAR(512) -- path for backup files DECLARE @fileName NVARCHAR(512) -- filename for backup DECLARE @fileDate NVARCHAR(40) -- used for file name -- specify database backup directory SET @path = 'C:\test\' -- specify filename format SELECT @fileDate = CONVERT(NVARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases AND state = 0 -- database is online AND is_in_standby = 0 -- database is not read only for log shipping OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor
Database Backup File Name Format DBname_YYYYMMDD_HHMMSS.BAK
If you want to also include the time in the filename you can replace this line in the above script:
-- specify filename format SELECT @fileDate = CONVERT(NVARCHAR(20),GETDATE(),112)
with this line:
-- specify filename format SELECT @fileDate = CONVERT(NVARCHAR(20),GETDATE(),112) + '_' + REPLACE(CONVERT(NVARCHAR(20),GETDATE(),108),':','')
Adding Additional Items to Backup Command
To add additional options, such as backup progress (stats) and compression, you can change this line in the script:
BACKUP DATABASE @name TO DISK = @fileName
with this line:
BACKUP DATABASE @name TO DISK = @fileName WITH STATS=10, COMPRESSION
There are plenty of other backup options you can add.
Notes
In this script we are bypassing the system databases, but these could easily be included as well. You could also change this into a stored procedure and pass in a database name or if left NULL it backups all databases. Any way you choose to use it, this script gives you the starting point to simply backup all of your databases.
Also, if you wanted to bypass some of your user databases you can include them in the NOT IN section as well.
Next Steps
- Add this script to your toolbox
- Modify this script and make it a stored procedure to include one or many parameters
- Enhance the script to use additional BACKUP options
About the author

View all my tips
Article Last Updated: 2022-07-06
Comments For This Article
Monday, September 25, 2023 - 2:55:57 PM - Greg Robidoux | Back To Top (91597) |
Hi Anil, the change assumes that each folder already exists for each database. So if you create the folders ahead of time it should work. Also, make sure your @path variable has a \ like this "C:\SQL2022\Backup\" -Greg |
Monday, September 25, 2023 - 10:18:26 AM - Anil Gupta | Back To Top (91596) |
Hello Greg It worked for the first database, rest of them failed as create a directory with in the first on e.g. C:\SQL2022\BackupSQLDWDiagnostics\DWDiagnostics_20230925.BAK' with error Operating system error 3(The system cannot find the path specified. I will work on the script may be i am not using my TSQL head too much. Many thanks Anil |
Monday, September 25, 2023 - 9:51:45 AM - Anil Gupta | Back To Top (91595) |
Thanks a million. I will try it and update Anil |
Monday, September 25, 2023 - 9:35:04 AM - Greg Robidoux | Back To Top (91594) |
Hi Anil, if the folders are already created for each database and the folder name matches the database name you could modify this section WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END to WHILE @@FETCH_STATUS = 0 BEGIN SET @path = @path + @name + '\' SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName FETCH NEXT FROM db_cursor INTO @name END |
Monday, September 25, 2023 - 7:20:12 AM - Anil Gupta | Back To Top (91593) |
Hello Great script , I was wondering if there is way to back up multiple user databases in there own folder. I did use mkdir command but i think i am missing someting. Many thank in advance Anil |
Thursday, June 29, 2023 - 8:55:58 PM - Cameron Neale | Back To Top (91355) |
Just a tip, use the FORMAT function whenever you need to format dates as strings: SELECT @fileDate = FORMAT(GETDATE(),'yyyyMMdd_HHmmss') |
Monday, April 17, 2023 - 11:31:05 AM - Marcos | Back To Top (91114) |
Thank you , very usefull and simple to apply. |
Friday, November 18, 2022 - 6:11:07 AM - Rafael | Back To Top (90698) |
Thank you very much for scripts. |
Tuesday, October 11, 2022 - 7:02:42 AM - Greg Robidoux | Back To Top (90586) |
Hi Chandu, looks like you are using these scripts: https://ola.hallengren.com/sql-server-backup.html I am not sure why it is skipping databases based on what you are using. Are all of the databases you are trying to backup online? -Greg |
Tuesday, October 11, 2022 - 2:41:40 AM - Chandu Patel | Back To Top (90583) |
this was the job script of a scheduled job of my servers, with this in one server its not skipping in DBs but in one server it's skipping few databases for full backup job, Greg Can you help me with this sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d tools -Q "execute [dbo].[DatabaseBackup] @Databases = 'ALL_DATABASES', @Directory = N'G:backuppath\Backup', @BackupType = 'FULL', @Verify = 'Y', @CleanupMode = 'BEFORE_BACKUP', @CleanupTime = 70, @CheckSum = 'Y', @LogToTable = 'Y'" -b |
Monday, October 10, 2022 - 8:33:43 PM - Chandu Patel | Back To Top (90581) |
Hi Greg It's a job history, even I tried with the same full backup job which run in other server, scripted and executed it in current server which has full backup skipping issues for few database, still its skipping databases, I tried everything I can, The same script is working fine in other servers but when I execute it in backup issue server it's not working properly, when I checked job history, it's showed that job was successful |
Monday, October 10, 2022 - 12:13:12 PM - Greg Robidoux | Back To Top (90578) |
Hi Chandu, Can you provide more info on what you mean by "it shows backup job is successful in the history"? Is this the job history or backup history? One other thing, some people suggested changing the cursor type to STATIC, because of this same issue. Thanks Greg |
Monday, October 10, 2022 - 11:26:43 AM - Chandu Patel | Back To Top (90577) |
I've a scheduled job for all Database, but still that job skips few DBs backup, even though it shows backup job is successful in the history, But when I retrigger the job manually "start job at the step" it backups perfectly, what could be the issue, |
Friday, July 22, 2022 - 4:04:25 AM - Muhammad Asad | Back To Top (90298) |
How we Create Database Backup from live server |
Wednesday, July 6, 2022 - 3:10:21 PM - Greg Robidoux | Back To Top (90236) |
Hi Andy, Good catch. It should be YYYYMMDD. I can't believe this article has been out there since 2006 and you were the first to notice. I will update the article. -Greg |
Wednesday, July 6, 2022 - 2:51:15 PM - Andy | Back To Top (90235) |
Why, oh why, would anyone use the date format yyyyddmm? Are you trying to be as obtuse as possible? The iso standard date (yyyy-mm-dd) which avoids the American (mm-dd-yyyy) and British (dd-mm-yyyy) confusion, and you go an invent an American version of that. An additional benefit of yyyy-mm-dd is that the files named as such will be in date order, rather than a useless order. |
Monday, December 13, 2021 - 9:47:51 AM - Greg Robidoux | Back To Top (89570) |
Hi Saiteja, Check out this article. https://www.mssqltips.com/sqlservertip/4353/export-sql-server-records-into-individual-text-files/ You will need to make a few changes to do table by table, but this might help you. -Greg |
Friday, December 10, 2021 - 5:17:46 PM - Saiteja | Back To Top (89565) |
DECLARE @PATH nvarchar(128)='[Path]\' DECLARE @SERVERNAME nvarchar(128)='' DECLARE @USERNAME nvarchar(128)='' DECLARE @PASSWORD nvarchar(128)='' DECLARE @table_name nvarchar(128) DECLARE @database_name nvarchar(128) DECLARE @schema_name nvarchar(128) PRINT 'REM Backup Script ' + CAST(GETDATE() AS nvarchar(30)) DECLARE abc CURSOR FOR SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES I JOIN sys.tables T ON I.Table_Name = T.Name JOIN sys.dm_db_partition_stats S ON t.object_id = s.object_id AND t.type_desc = 'USER_TABLE' AND s.index_id = 1 AND s.row_count >0 ORDER BY t.name collate Latin1_general_BIN2 OPEN abc; FETCH NEXT FROM abc INTO @database_name, @schema_name, @table_name WHILE (@@FETCH_STATUS = 0) BEGIN PRINT 'BCP ' + @database_name + '.' + @schema_name + '.' + @table_name + ' OUT "' + @PATH + @table_name +'.dat" -S "' + @SERVERNAME + '" -U "' + @USERNAME + '" -P "' + @PASSWORD + '" -N' FETCH NEXT FROM abc INTO @database_name, @schema_name, @table_name; END; CLOSE abc; DEALLOCATE abc; GO |
Friday, December 10, 2021 - 5:10:10 PM - Greg Robidoux | Back To Top (89564) |
Hi Saiteja, Are you using SQLCMD for the BAT file? Could you post your script? -Greg |
Friday, December 10, 2021 - 5:06:47 PM - Saiteja | Back To Top (89563) |
Trying to do backup by generating bat file from the script |
Friday, December 10, 2021 - 4:45:34 PM - Greg Robidoux | Back To Top (89562) |
Hi Saiteja, are you trying to do a BACKUP or use BCP? -Greg |
Friday, December 10, 2021 - 3:23:41 PM - Saiteja | Back To Top (89561) |
While extracting DB i am getting error as BCP is not recognised as an internal or external command,operable program or batch file Could you please help me with this |
Friday, September 24, 2021 - 8:27:51 AM - Greg Robidoux | Back To Top (89261) |
If you are just using the database name as the backup file, then each backup gets added to the same file. You will need to add FORMAT, INIT to the command as follows. This will initialize the file and overwrite the previous contents. BACKUP DATABASE @name TO DISK = @fileName WITH FORMAT, INIT You can check out this info for more backup options: https://docs.microsoft.com/en-us/sql/t-sql/statements/backup-transact-sql?view=sql-server-ver15 |
Friday, September 24, 2021 - 2:40:08 AM - çağlar can sarıkaya | Back To Top (89258) |
if the backup filename is same(like just db name) when it is gettig backup if there is same name file, its not deleting old backup file, its stacking with older version. like you get a back up today and its 100mb then you get another tomorrow, you expect 100 or 101 but it gonna be 200 something. Because its not deleting older one, even the file names are same |
Tuesday, July 27, 2021 - 10:51:44 AM - Michael White | Back To Top (89055) |
Thank you! This script is a great help!! |
Wednesday, July 21, 2021 - 12:12:30 PM - Jeff | Back To Top (89035) |
For instructional purposes this is a good exercise for explaining how to automate backups by T-SQL. However, since this was originally posted, Ola Hallengren's maintenance scripts came on the scene (and dbaTools if you prefer Powershell) and has become near industry standard for automating production databases. Just thought I'd mention these other options that have since become available. |
Wednesday, July 7, 2021 - 8:57:45 AM - Jacco Klene | Back To Top (88959) |
simple and efficient. |
Monday, April 5, 2021 - 9:08:05 AM - Neha | Back To Top (88491) |
Thanks for such a nice explanation |
Saturday, December 5, 2020 - 11:09:49 PM - Mohammad Sultan Al Mamun | Back To Top (87887) |
Thanks a lot for this very valuable time saving tips. |
Friday, December 4, 2020 - 10:21:46 AM - AIJAZ ALI | Back To Top (87881) |
Very simple script. Thanks a lot! |
Monday, October 19, 2020 - 10:03:12 AM - Greg Robidoux | Back To Top (86658) |
Yes it backs up everything in the database, tables, stored procedures, triggers, data, etc. |
Sunday, October 18, 2020 - 9:54:04 PM - Kevin | Back To Top (86657) |
Does it include stored procedures? |
Monday, October 5, 2020 - 1:18:44 AM - trupti | Back To Top (86595) |
Thank you so much Greg, after adding read cursor my issue is resolved. :) |
Friday, October 2, 2020 - 3:04:03 AM - trupti | Back To Top (86584) |
Hello Greg, Thank you so much for prompt revert. I am surprised that on test its working fine. On Prod instance was initially it worked fine.But now its skipping databases also no error in job history. No logs in SQL error log too. Lets see I have added the Read_only cursor in script. I will monitor todays run. Prod script:- DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name SET @path = 'J:\FullBackup\' SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName with COPY_ONLY,COMPRESSION FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor ++++++++++++++++++++++++++++++++++++ Test script DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name SET @path = 'J:\FullBackupTest\' SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName with COPY_ONLY,COMPRESSION FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor |
Thursday, October 1, 2020 - 12:26:38 PM - Greg Robidoux | Back To Top (86579) |
Trupti, take a look at the script in the tip that uses a Read Only cursor. Use the script above and then modify the command to add compression and copy only. -Greg |
Thursday, October 1, 2020 - 11:59:47 AM - trupti | Back To Top (86578) |
Hello Greg, I am using user script but unfortunately its not taking all user databases I need to take all 51 db backup but with this script it ia backing up 23 dbs only. How can I fix this. DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name SET @path = 'J:\FullBackup\' SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName with COPY_ONLY,COMPRESSION FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor |
Tuesday, August 6, 2019 - 6:17:24 PM - Dean | Back To Top (81987) |
Just to supplement Fernando Hraste's comment in case you are going through any issues: I've changed the @path variable to full network path (i.e. if you mapped \\100.100.100.1\folder, change your @path to ='\\100.100.100.1\folder') and it worked flawlessly. |
Wednesday, June 12, 2019 - 3:59:44 AM - Lars Nielsen | Back To Top (81428) |
Thanks for this useful script. A simple point is that 50 characters isn't much for a database name - I got an error "database doens't exist" because the db name was longer than 50 characters. To fix this change the first line to VARCHAR(255). |
Monday, May 20, 2019 - 8:46:24 AM - Fernando Hraste | Back To Top (80130) |
If you need make the backup into another networklocation, you can use a simple script to map it: execute xp_cmdshell 'net use \\[ip adress][Folder nme] [password] /User:[domain\username]' Then, excecute the routine backup |
Thursday, January 31, 2019 - 11:47:27 AM - Greg Robidoux | Back To Top (78926) |
Hi Anshul, Why are you chaning the database recovery model? There shouldn't be a need to change it before you run backups. For Azure, you should be able to change the path to use a URL. Take a look at this for more info. https://docs.microsoft.com/en-us/sql/tutorials/lesson-3-write-a-full-database-backup-to-the-windows-azure-blob-storage-service?view=sql-server-2014 https://docs.microsoft.com/en-us/sql/relational-databases/tutorial-use-azure-blob-storage-service-with-sql-server-2016?view=sql-server-2017 -Greg |
Thursday, January 31, 2019 - 4:21:21 AM - Anshul | Back To Top (78922) |
Hi Greg, In my scenario, i want to store the backup files to Azure blob. But i am not able to get the correct syntax for it, have tried multiple things. Can you please help here? Waiting for your reply. Thanks. Please see the lines i added to work on each database- SET @query = 'ALTER DATABASE ['+@dbname+'] SET RECOVERY FULL; SET @fileName = @path + [@dbname] + @fileDate + '.bak' |
Friday, January 11, 2019 - 1:54:14 PM - Greg Robidoux | Back To Top (78739) |
Hi Dev, here are some tips to help with deleting old files. https://www.mssqltips.com/sqlservertip/4499/delete-old-sql-server-backup-files-with-a-stored-procedure/ https://www.mssqltips.com/sqlservertip/1324/maintenance-task-to-delete-old-sql-server-backup-files/ https://www.mssqltips.com/sqlservertip/2726/using-a-powershell-script-to-delete-old-files-for-sql-server/ https://www.mssqltips.com/sqlservertip/3458/automate-sql-server-express-backups-and-purge-old-backups/ https://www.mssqltips.com/sqlservertip/1486/automate-sql-server-express-backups-and-deletion-of-older-backup-files/ https://www.mssqltips.com/sqlservertip/1374/clr-function-to-delete-older-backup-and-log-files-in-sql-server/ -Greg |
Thursday, January 10, 2019 - 11:55:31 PM - Dev | Back To Top (78705) |
Thanks Greg for the rapid response... is there any script that automatically deletes the previous .bkp and starts latest backup again? |
Thursday, January 10, 2019 - 8:59:44 AM - Greg Robidoux | Back To Top (78692) |
Hi Dev, yes this script will create a full backup of all databases excluding any of the databases that you specify that you don't want to back up. -Greg |
Thursday, January 10, 2019 - 4:53:22 AM - Dev | Back To Top (78686) |
Did this script takes whole database backup like example (Inclue all object along with data, nothing will be skipped ???) |
Friday, December 7, 2018 - 7:20:20 PM - Gladson Reis | Back To Top (78429) |
Perfect ! |
Friday, November 16, 2018 - 10:48:22 AM - Greg Robidoux | Back To Top (78273) |
Hi Venkat, you can just add these items to the above script as follows: BACKUP DATABASE @name TO DISK = @fileName WITH STATS=10, COMPRESSION -Greg |
Friday, November 16, 2018 - 4:12:01 AM - Venkat | Back To Top (78271) |
Hi Greg, Can you please provide the compression and stats=10 to the backup script. |
Tuesday, October 23, 2018 - 7:09:44 AM - Dennis | Back To Top (78034) |
Wohaaa, thanks for that simple but really effective script! This saves me a lot of time backing up my databases :)
|
Wednesday, August 29, 2018 - 2:13:34 PM - Muhammad Rehan Qadri | Back To Top (77338) |
When I ran above script I got: Msg 3201, Level 16, State 1, Line 23 Cannot open backup device 'E:\BackupAllDBsByMRQ\aclc_20180829.BAK'. Operating system error 3(The system cannot find the path specified.). Thanks to following link which solved the issue: |
Tuesday, August 28, 2018 - 4:07:40 PM - Nagaraju Kadiyala | Back To Top (77326) |
Script needs to create folder with server name under this folder needs create subfolders with database name wise and backups should be created under the database subfolders. can you please provide the script like that. i tried to use below but i wont create ant folders under the shared path. and got below error. Could you please help on this? SET @path = '\\XXX112\sqlbackups$\'+ @@SERVERNAME +'\'+@DBname Error: Msg 3044, Level 16, State 1, Line 26 Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. Msg 3013, Level 16, State 1, Line 26 BACKUP DATABASE is terminating abnormally. Msg 3044, Level 16, State 1, Line 26 Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. Msg 3013, Level 16, State 1, Line 26 BACKUP DATABASE is terminating abnormally. |
Tuesday, August 28, 2018 - 3:41:26 PM - Nagaraju Kadiyala | Back To Top (77325) |
Hi Got below error while executing this script. Msg 3044, Level 16, State 1, Line 24 Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. |
Tuesday, May 22, 2018 - 6:17:03 AM - lek | Back To Top (75997) |
thanks a lot ka. |
Tuesday, May 8, 2018 - 3:56:42 PM - santosh kumar yogi | Back To Top (75901) |
Thanks Greg. Awesome answers. It is working |
Saturday, April 21, 2018 - 3:26:07 AM - www4000 | Back To Top (75746) |
AAAWESOME!!! |
Wednesday, April 4, 2018 - 10:28:41 AM - Philip Elder | Back To Top (75605) |
Greg, I ran the backup with defaults to FILE in SQL Management Studio. It's working now, it wasn't working, at least until I ran the backup process manually. Go figure. :) |
Wednesday, April 4, 2018 - 7:00:59 AM - Sheik Ahmed SM | Back To Top (75601) |
Thanks Greg. Awesome answers. It is working |
Tuesday, April 3, 2018 - 8:07:24 AM - Greg Robidoux | Back To Top (75587) |
Hi Sheik Ahmed, Try this to get DDMMYYYY format. SELECT @fileDate = replace(convert(varchar, getdate(),104),'.','') -Greg |
Tuesday, April 3, 2018 - 5:59:30 AM - sheik ahmed sm | Back To Top (75586) |
I need script backupwith ddmmyyyy. 112 gives yyyymmdd.
for example date i need in reverse format. SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) |
Monday, April 2, 2018 - 12:48:03 PM - Greg Robidoux | Back To Top (75582) |
Hi Philip, that is kind of weird that after backing a database manually the script then worked. Did you do just a simple BACKUP DATABASE command or did you include any options with the backup? -Greg |
Monday, April 2, 2018 - 12:37:39 PM - Philip Elder | Back To Top (75581) |
Greg, Thanks for the reply. Yes, the simple query returns a list of all databases running in the instance. I modified the path to local storage and it ran successfully but no files were produced. I ran a manual backup against one of the key databases and then the backup query seemed to run just fine. All databases get backed up without issue. Weird. |
Monday, April 2, 2018 - 12:19:32 PM - Greg Robidoux | Back To Top (75580) |
Hi Philip, If you run this query, do you get a list of databases returned?
SELECT name |
Monday, April 2, 2018 - 11:16:40 AM - Philip Elder | Back To Top (75578) |
Hi, The script runs successfully with no errors but no file gets produced? |
Monday, March 19, 2018 - 12:00:53 PM - Greg Robidoux | Back To Top (75464) |
Hi pabbhi, you can just change line in the code above to do copy only backups. BACKUP DATABASE @name TO DISK = @fileName to BACKUP DATABASE @name TO DISK = @fileName WITH COPY_ONLY -Greg |
Monday, March 19, 2018 - 11:18:59 AM - pabbhi | Back To Top (75463) |
how to take copyonly backup for all databases |
Saturday, March 3, 2018 - 7:29:05 AM - Greg Robidoux | Back To Top (75341) |
Hi RPi80 You could do this without the cursor and use a loop like Dave did in the script below. Both approaches will work. The cursor won't damage any data in the database, but the problem you could have with cursors is that data can be updated by other processes and therefore cause an issue with the cursor data (like skipping a database). This is why this was changed to a read only cursor to make sure the data stays consistent, plus we are not planning on updating the data in the cursor so this is a better option. Also, since the backups will take some time to complete the read only option makes more sense. You could also look at other cursor options like static, forward_only, etc. Take a look at these other articles for more information about how cursors work and the options: https://sqlperformance.com/2012/09/t-sql-queries/cursor-options https://sqlperformance.com/2015/09/t-sql-queries/cursor-options-2 https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql -Greg |
Saturday, March 3, 2018 - 5:47:04 AM - RPi80 | Back To Top (75340) |
Hi All! @Greg Robidoux Great script! What You think about Dave's script (w/out using CURSOR at all)?
Robert
|
Thursday, February 15, 2018 - 1:23:31 AM - Ahsan | Back To Top (75215) |
how can i create a folder datewise through above statements and on that datefolder my backup should be placed
|
Friday, February 9, 2018 - 8:11:46 AM - Greg Robidoux | Back To Top (75146) |
Hi Ranu, try converting things to NVARCHAR as follows: DECLARE @name NVARCHAR(100) -- database name |
Friday, February 9, 2018 - 1:24:54 AM - ranu gupta | Back To Top (75142) |
I work on same code. But I got a error "Msg 8114, Level 16, State 12, Line 16 Error converting data type varchar to nvarchar." |
Wednesday, January 31, 2018 - 1:33:46 AM - Compressed | Back To Top (75064) |
Add WITH COMPRESSION to the end of BACKUP -command to ensure your backups doesn't eat all your diskspace. |
Sunday, January 21, 2018 - 8:40:26 AM - Greg Robidoux | Back To Top (75001) |
Hi Santiago, You can use SQLCMD and run this from Windows Task Scheduler. Take a look at this tip too as another option: https://www.mssqltips.com/sqlservertip/3458/automate-sql-server-express-backups-and-purge-old-backups/ -Greg |
Saturday, January 20, 2018 - 6:35:30 PM - SantiagoE | Back To Top (74999) |
Works fine with SQL Express 2012. Now, how can use this script to programing into Task Scheduler? |
Thursday, December 21, 2017 - 7:36:22 AM - Dayo O | Back To Top (74307) |
Good one!
|
Tuesday, December 19, 2017 - 9:50:07 AM - Leo | Back To Top (74243) |
Thanks for the script, it really helped! |
Monday, August 7, 2017 - 11:13:36 AM - dave | Back To Top (64225) |
Or if you want to do with out a cursor (and you should):-
DECLARE @name VARCHAR(50) -- database name SELECT @name = min (name ) WHILE @name IS NOT null --SELECT @name
|
Friday, July 21, 2017 - 9:04:08 PM - Arturo Cruz | Back To Top (60044) |
Hi, I need to do a partial backup (only some tables), and if any of these tables have referential integrity, I can do this, I'm dead for days trying to find a solution. Thank you
|
Friday, July 21, 2017 - 5:51:13 PM - Joe Bock | Back To Top (60026) |
Hello - I'll come clean at the beginning...I am not a developer, but have assumed the role of Release Manager and my SQL background is limited. My goal is to have a script run during a desktop application install that will backup and restore an existing database.
I need help with a backup/restore of an existing SQL 2008 Express database to a new instance of SQL 2014 Express.
I have scripts that do the backup and restore, but they were previously used with the same instance name. I want to modify the script below to include the step of restoring to the newly created instance name.
Can someone look at this script and suggest how I can restore the database to a different instance name?
////////////////////////////
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
/****** Object: StoredProcedure [dbo].[proc_restore_Backup] Script Date: 01/15/2008 10:26:23 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_restore_Backup]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[proc_restore_Backup]
GO
CREATE PROCEDURE [dbo].[proc_restore_Backup]
@Database varchar(50) = '%'
AS
DECLARE @DBName sysname,
@statement VARCHAR(8000),
SET @DBName = 'ABC',
-- Entering Backup Command.
SET @statement = 'RESTORE DATABASE ' + @DBName +
' FROM DISK = ' + '''' + @dbname + '.bak'' WITH STATS = 20'
-- Executing
IF @DBName <> ''
BEGIN
PRINT 'restoring Database: ' + @DBName
EXEC (@statement)
PRINT ''
END
////////////////////////////
Thanks in advance!! |
Thursday, June 15, 2017 - 9:42:49 PM - Greg | Back To Top (57448) |
Thanks, Greg. This is awesome and just what I need right now as I'm on my first Access project that uses a SQL Server backend. To anyone interested, I've adapted this to a Stored Procedure which backsup a specific database by changing the WHERE clause. The name of the database is passed as a parameter along with the back up folder (done from my Access front end via VBA and a pass-through query. Here's the sp..
CREATE PROCEDURE [dbo].[sp_SYSTEM_FullBackup] @DBname VARCHAR(50), -- database name @path VARCHAR(256) -- folder path for backup files As BEGIN SET NOCOUNT ON;/* Turns off row counting */ DECLARE @BAKName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used to append Date & Time to Backup filename: @BAKName --credit to Greg Robidoux, MSSQLTIPS.com -- https://www.mssqltips.com/sqlservertip/1070/simple-script-to-backup-all-sql-server-databases/ -- specify database backup directory --SET @path = 'C:\Backup\' --
-- specify filename format i.e. Date and time... SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE(CONVERT(VARCHAR(20),GETDATE(),108),':','')
DECLARE db_cursor CURSOR READ_ONLY FOR SELECT name FROM master.dbo.sysdatabases WHERE name = @DBname
OPEN db_cursor FETCH NEXT FROM db_cursor INTO @DBname
WHILE @@FETCH_STATUS = 0 BEGIN SET @BAKName = @path + @DBname + '_' + @fileDate + '.BAK' BACKUP DATABASE @DBname TO DISK = @BAKName
FETCH NEXT FROM db_cursor INTO @DBname END
CLOSE db_cursor DEALLOCATE db_cursor SET NOCOUNT OFF;/* Restores row counting */ END
Kind regards, Greg Regan |
Tuesday, June 6, 2017 - 2:12:55 PM - Greg Robidoux | Back To Top (56894) |
Hi Mike, Glad to hear this worked. As the default, cursors can be updated, so it is possible something else updated the data the cursor was using and through the cursor out of whack. This is why a lot of people don't like to use cursors and often build their own loops use a temporary table. I will update the query to add the READ_ONLY to the cursor. Thanks for testing and the feedback. -Greg |
Tuesday, June 6, 2017 - 2:06:22 PM - Mike Cataldo | Back To Top (56893) |
Greg, Thanks for the help, looks like the READ_ONLY option did the trick. Do you know why this would have an impact? Mike |
Tuesday, June 6, 2017 - 12:45:00 PM - Mike Cataldo | Back To Top (56890) |
Greg, Trying the read only option now. Mike |
Tuesday, June 6, 2017 - 12:39:38 PM - Mike Cataldo | Back To Top (56888) |
Greg, I modified the script to backup our 2 largest databases, it backed up the first but failed to backup the second? The job ran for 8 minutes and reported no errors. Mike |
Tuesday, June 6, 2017 - 10:52:29 AM - Greg Robidoux | Back To Top (56883) |
Hi Milke, Another thing you can try is to make the cursor read only. Sorry I don't have large databases I can test this on. Change the declare cursor line to this: DECLARE db_cursor CURSOR READ_ONLY FOR
|
Tuesday, June 6, 2017 - 10:39:19 AM - Greg Robidoux | Back To Top (56882) |
Hi Mike, can you add a filter in the WHERE clause and just backup the one large database to see if that works without issue. -Greg |
Tuesday, June 6, 2017 - 10:24:51 AM - Mike Cataldo | Back To Top (56881) |
Greg, Setting the Execution Time Out parameter to 7200 had no impact on the results. It backed up all databases until it encountered one of our largers customers and then just stopped. Mike |
Tuesday, June 6, 2017 - 10:22:33 AM - Mike Cataldo | Back To Top (56880) |
Greg, Thanks for the quick response. It will vary by customers but some of our larger backups are between 30 - 40Gb. I did notice the "Execution Time Out" setting when creating the mainteancne plan, it's set to 0 which I assumed meant NO timeout. I'm running a test now setting the Execution Time Out to 7200 seconds to see If I can get it to backup every database. When running as an Agent Job it reports success, no errors logged. I checked the text log file associated with the job, again, no errors reported. I did ORDER the results of the cursor so I could see if it continusouly stops at the same large database. Mike
|
Tuesday, June 6, 2017 - 10:12:35 AM - Greg Robidoux | Back To Top (56879) |
Hi Mike, How large are the databases you are trying to backup? To be honest I did not test with very large databases, so it is possible there is a time out issue. You could try to get rid of the cursor and do a loop instead to see if that makes a difference, not sure it will but it is worth trying. To you get any error message or does it just back up some databases and then just stop? Are you doing this in a query window or running through a SQL Agent job? Also, you can see the post below from Aaron Nelson about using PowerShell. -Greg
|
Tuesday, June 6, 2017 - 9:39:53 AM - Mike Cataldo | Back To Top (56878) |
Greg, I love the simplicity of the script but I see others having issues if the databases are large in size. I read the posts but don't see an answer for larger databses. Any help would be greatly appreciated. I've run the script interactively and as an agent job with the same behavior, it just stops as it encounters larger databases. Mike |
Tuesday, February 7, 2017 - 7:26:54 AM - Aaron Nelson | Back To Top (46071) |
Just wanted to contribute this in case it helps someone: This short 3 lines of PowerShell code will backup every database on an entire instance for you: Get-SqlDatabase -ServerInstance localhost |
|
Saturday, December 31, 2016 - 7:22:50 PM - kiranbapuji | Back To Top (45073) |
Hi Greg, We are backing up to different files everytime with belwo naming fomat for the backup piece.
For example: dbname_backup_date_time.bkp upon failure with the error I mentioned in first post, I just give a retry and it went perfect. So, I would like to know why it is gonna failed every weekend and upon rereun why it is getting success?
Thanks for your help. Regards, Kiranbapuji.
|
Wednesday, December 28, 2016 - 11:38:43 AM - Greg Robidoux | Back To Top (45057) |
Hi Kiran, it looks like the backup file might be corrupt. I would try to take the backup and restore to see if the restore works. Also, check to see if you are backing up to the same file each time. If so, I would try to backup the database to a new file and see if that works. -Greg |
Sunday, December 25, 2016 - 10:56:46 PM - kiran bapuji | Back To Top (45047) |
Full backup getting failed every weekend with below error: Task start: 2016-12-25T00:00:11. Task end: 2016-12-25T02:05:23. Failed:(-1073548784) Executing the query "declare @backupSetId as int select @backupSetId =..." failed with the following error: "Damage to the backup set was detected. VERIFY DATABASE is terminating abnormally.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
upon re-run , its getting successfull.
Could you help me in finding the culprit for the backup issue in the weekend?
|
Tuesday, October 4, 2016 - 11:00:48 AM - Greg Robidoux | Back To Top (43493) |
Amul, You can also run this using SQLCMD so you can run from a batch file. Take a look at this: https://msdn.microsoft.com/en-us/library/ms180944.aspx -Greg |
Tuesday, October 4, 2016 - 9:16:19 AM - Amul Pandit | Back To Top (43491) |
Hello Greg, THanks a Lot once again. It worked perfectly in SSMS environment. I do not want the user to open SSMS. Can this file be run from externally and still the back up be obtained ??? Please help me
|
Tuesday, October 4, 2016 - 8:51:05 AM - Amul Pandit | Back To Top (43489) |
Can I call this file from VB code? |
Tuesday, October 4, 2016 - 8:42:17 AM - Amul Pandit | Back To Top (43488) |
Thanks a lot... CAn it be executed from outside SSMS ? I mean like a batch file or calling it from VB code ?
|
Tuesday, October 4, 2016 - 5:14:15 AM - Greg Robidoux | Back To Top (43486) |
Hi Amul, the code can be placed in a query window in SQL Server Management Studio and executed from the query window. I suggest your try this out on a development instance first, so you can understand what it is doing. Also, take a look at this backup tutorial to learn more: https://www.mssqltips.com/sqlservertutorial/1/sql-server-backup-options-and-commands-tutorial/
-Greg |
Tuesday, October 4, 2016 - 3:35:11 AM - Amul Pandit | Back To Top (43485) |
Hello, Understood the concept but tell me where should I write the code and whhch command should I run to execute the same????
|
Thursday, July 7, 2016 - 6:27:29 PM - Vishnu | Back To Top (41829) |
Hi, can anyone help with singlecode for my problem suppose i have two to five servers like server1, server2,.....server5, in this all 5 servers having different DB's every db having daily backup jobs now i want a single script for this five servers all db's backups are running everyday or not,if yes status yes if not failing any backups status No like this. Thanks Vishnu |
Wednesday, June 22, 2016 - 2:37:05 PM - Corey Zamara | Back To Top (41743) |
Great script, works exactly as expected, everything backed up fine, my question is do you have a script that will look through the directory and attach all the DB's? I saw you have this one https://www.mssqltips.com/sqlservertip/1584/auto-generate-sql-server-restore-script-from-backup-files-in-a-directory/
But I was wondering if you can just automate the diretory instead of using the name like a wildcard. |
Tuesday, June 7, 2016 - 1:52:48 PM - Greg Robidoux | Back To Top (41631) |
Hi Josh, I would use this link if you want to integrate it with above script: https://www.mssqltips.com/sqlservertip/1618/using-the-forfiles-command-to-delete-sql-server-backups/ Read that tip and at the very end of my script add the command line that tip 1618 explains. Take a look at the article below too. This explains how to enable xp_cmdshell https://msdn.microsoft.com/en-us/library/ms190693.aspx
Offhand, not sure of books but you can check out this one or others on Amazon https://www.amazon.com/Getting-Started-T-SQL-Introduction-Writing-ebook/dp/B019A45VLO/ref=sr_1_fkmr0_1?ie=UTF8&qid=1465321915&sr=8-1-fkmr0&keywords=writing+t-sql+code |
Tuesday, June 7, 2016 - 1:42:16 PM - Josh C | Back To Top (41630) |
Greg, I am new to SQL scripting, I reviewed your below links and tried to insert delete scripts into the above back up script and had no luck getting it to pass the debugger in SQL Server management studio. Not sure what do do from here. Any recommendations on books/manuals to help beginers like me learn SQL scripting?
|
Tuesday, June 7, 2016 - 9:48:04 AM - Greg Robidoux | Back To Top (41628) |
Hi Josh, take a look at these tips for different ways to delete older backup files: https://www.mssqltips.com/sqlservertip/1618/using-the-forfiles-command-to-delete-sql-server-backups/ https://www.mssqltips.com/sqlservertip/1486/automate-sql-server-express-backups-and-deletion-of-older-backup-files/ https://www.mssqltips.com/sqlservertip/2726/using-a-powershell-script-to-delete-old-files-for-sql-server/ https://www.mssqltips.com/sqlservertip/1374/clr-function-to-delete-older-backup-and-log-files-in-sql-server/ https://www.mssqltips.com/sqlservertip/1324/maintenance-task-to-delete-old-sql-server-backup-files/ |
Tuesday, June 7, 2016 - 6:39:00 AM - Josh C | Back To Top (41625) |
The script works great, but i want to be able to delete back ups automatically after say 14 days, what do I need to add to the above script to achieve this? and where does it need to be added? Also, where in the code can i specify the back up to occur at 10am and 6pm daily?
|
Thursday, April 28, 2016 - 5:56:27 AM - Greg Robidoux | Back To Top (41358) |
Hi Mango, Not sure why this is not working. I tried your script below and this works for me too. Kind of hard to troubleshoot if it works when you run it in a query window, but not from SQL Agent. Also, not very helpful that SQL Agent doesn't give you any error messages to troubleshoot. Another thing you could try is to use SQLCMD and run this from Windows Task Scheduler to see if that works.
|
Thursday, April 28, 2016 - 3:26:25 AM - Magno | Back To Top (41356) |
Btw, this is the backup script we currently have: DECLARE @name VARCHAR(50); -- Database name |
Thursday, April 28, 2016 - 3:15:44 AM - Magno | Back To Top (41355) |
Hi,
I created a second job which will only print the result, and runs at the same time as the original job. Because when I ran it yesterday, everything went OK. So the backup job only did the first one, the "print" job printed all the different database backup jobs. I've tried to find some logic in it, but was thusfar unable to find any...
-Magno |
Wednesday, April 27, 2016 - 7:15:59 AM - Greg Robidoux | Back To Top (41349) |
Hi Mango, change this script line to get a list of all the backup commands from: BACKUP DATABASE @name TO DISK = @fileName to PRINT 'BACKUP DATABASE ' + @name + ' TO DISK = ' + @fileName Then take the output and create a SQL Agent job with just the commands to see if this works or not. If this works, you can rule out SQL Agent as an issue. -Greg |
Wednesday, April 27, 2016 - 4:32:34 AM - Magno | Back To Top (41348) |
Hi,
It's different versions. going from SQL 2008, 2012 and 2014. Just checked again this morning, but the semicolon didn't do the trick sadly. The SQL Agent user is however a sysadmin, so it couldn't be a security issue. One of the customers, we changed the sort order to make sure the LIVE database was always exported, but the naming on the newer customers is somewhat harder, so we couldn't just change the order by clause. When running interactively, or manually invoking during the day doesn't seem to affect nor give errors, everything runs fine then. |
Tuesday, April 26, 2016 - 10:56:35 AM - Greg Robidoux | Back To Top (41346) |
Hi Mango, I just tried this with SQL Server 2012 - 11.0.5058.0 (X64) and this worked too. There were 9 databases. -Greg |
Tuesday, April 26, 2016 - 10:45:49 AM - Greg Robidoux | Back To Top (41345) |
Hi Magno, What version of SQL Server are you using? I just tried this using SQL Server 2014 - 12.0.2269.0 (X64) and this worked. If you run this interactively from a query window do you get any error message or does it just stop running? -Greg |
Tuesday, April 26, 2016 - 10:35:22 AM - Magno | Back To Top (41344) |
Has any else recently noticed that the update stops after the first database? We implement this script with our customers and have so far had 4 customers where the backups stopped after the first database. The first customer was around a week ago. The last stopped working yesterday. Anybody know about windows updates that might have caused this. If we alter the script to only print the @name, it prints everything. |
Tuesday, April 5, 2016 - 5:33:29 AM - merc | Back To Top (41137) |
better to include only online databases and selecting them from sys.databases like:
SELECT name FROM sys.databases WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases AND state = 0
This is useful for eventually failovered mirrored DBs, so you can have the same t-sql on both servers without having a lot of errors
Thanks merc
|
Monday, March 28, 2016 - 10:37:00 AM - Greg Robidoux | Back To Top (41072) |
Hi GeorgeH, Take a look at this tip to see if you can use this to delete older backups. https://www.mssqltips.com/sqlservertip/1486/automate-sql-server-express-backups-and-deletion-of-older-backup-files/ Thanks
|
Monday, March 28, 2016 - 9:09:11 AM - georgeh | Back To Top (41071) |
thanks how can i add also in thiw scipt the possibility to delete all the old backups (.bak files) older than 3 days br
|
Thursday, March 24, 2016 - 9:26:34 AM - Greg Robidoux | Back To Top (41045) |
Hi Deepak, You can use this command to change the Recovery Model. Say your database name is MyDatabase the command is ALTER DATABASE MyDatabase SET RECOVERY FULL You can check out the backup tutorial for more information: https://www.mssqltips.com/sqlservertutorial/1/sql-server-backup-options-and-commands-tutorial/ Thanks
|
Thursday, March 24, 2016 - 2:16:52 AM - Deepak | Back To Top (41043) |
Thanks. How can I specify backup options like "Recovery Mode", I need to set it to "Full". Can we do it in script? |
Wednesday, January 13, 2016 - 3:27:32 PM - Éd Santos | Back To Top (40414) |
Worked perfectly. Thanks! |
Friday, November 27, 2015 - 10:50:15 AM - Angel Ciau | Back To Top (39148) |
muchas gracias amigo... |
Wednesday, November 18, 2015 - 7:46:56 AM - ramesh more | Back To Top (39093) |
pls give mi database backup script |
Sunday, August 30, 2015 - 2:54:54 AM - Jose Marie Bohol | Back To Top (38566) |
Hello Greg, Greetings! Would you mine to include the error handling in the looping statement for sql server version [2005 and above]? For example: While @@FETCH_STATUS = 0 Begin try Begin End
Begin catch End catch |
Friday, July 10, 2015 - 4:18:00 AM - Fry Simpson | Back To Top (38169) |
Thank you |
Thursday, July 9, 2015 - 10:08:28 AM - Greg Robidoux | Back To Top (38162) |
Hi Fry, see if you can take the concept from this tip to build what you need. You would need to make a few adjustments, but hopefully this gives you a start. I will try to write another tip to do what you suggest, but not sure when I will get to it. -Greg |
Thursday, July 9, 2015 - 6:17:26 AM - Fry Simpson | Back To Top (38161) |
I have read that tip, but I understand it deals with restoring one database. What I would like, instead, is a script which performs the inverse operation of the script in this tip. The script in this tip, for which I thank you, performs the backup of all databases in one single run. It would be very useful a script which cycles on every *.bak file in the Backup directory and restores the corresponding database. Is it possible? With my knoledge the only way I know to restore all db is right-click on the DB --> Tasks --> Restore, but I have to redo manually this operation over and over one time for each single DB. |
Wednesday, July 1, 2015 - 5:14:50 PM - jonny | Back To Top (38100) |
Excellent tutorial ... Thanks !!!
|
Thursday, May 28, 2015 - 11:11:22 PM - Kent | Back To Top (37314) |
Hi Greg, Thanks for testing it out. I will check more on the TRY..CATCH parameter and see how we can use it in our environment.
|
Thursday, May 28, 2015 - 4:47:58 PM - Greg Robidoux | Back To Top (37307) |
Hi Kent, I haven't tried every scenario, but it looks like the process will try to do each database even if one fails. I did a couple of tests where the folder didn't exist and it failed for each database in the list. Also tried a database that was offline, this failed but the other databases backed up without issue. For extra measure you could create a calling stored procedure and also use TRY..CATCH to catch an error and continue on if there is an issue. -Greg |
Thursday, May 28, 2015 - 1:23:09 AM - Calvin | Back To Top (37300) |
Hey Greg, thanks for posting this. As a newbie,, this has saved me a lot of time. much appreciation. Calvin |
Wednesday, May 27, 2015 - 3:11:11 AM - Kent | Back To Top (37282) |
Hi Greg, Can I know what will happen if one of the database failed to backup? Will the remaining of the database failed to backup as well? Thank You.
|
Monday, May 25, 2015 - 8:08:34 AM - pio11 | Back To Top (37273) |
First thanks to Greg for this article. Second: if anybody want use batch (and use sqlcmd) there is simple example: sqlcmd -S .\INSERTGT -U sa -P mypass123 -i backup.sql or You may use query "inline" like this: sqlcmd -S .\INSERTGT -U sa -P sa -d test55 -s "|" -w 1000 -Q "Select TOP 20 dok_Id,dok_Nr,dok_NrPelny FROM dbo.dok__Dokument" |
Monday, May 25, 2015 - 4:29:52 AM - Martin Henning | Back To Top (37272) |
Brilliant!! Works 100% with SQL Server 2012. Thank you!! |
Thursday, March 26, 2015 - 10:33:05 AM - Greg Robidoux | Back To Top (36716) |
Hi Lian, yes this script should work for SQL Server 2000 and higher versions. Take a look at this tip for the restores: http://www.mssqltips.com/sqlservertip/1243/auto-generate-sql-server-database-restore-scripts/ -Greg |
Wednesday, March 25, 2015 - 9:52:50 PM - Lian Way | Back To Top (36702) |
Dear Sir, This is awesome scripts. May I know if this is working for mssql 2000 enterprise edition and mssql 2008 r2?
Thanks in advance. |
Saturday, March 7, 2015 - 9:08:20 AM - Dragonfly | Back To Top (36465) |
AWESOME!!! Thnx! |
Tuesday, January 27, 2015 - 6:29:11 AM - Stefano Gioia | Back To Top (36066) |
Hi, Greg. You might wanna turn that cursor into a STATIC CURSOR to avoid any problems if the data changes while the backups are running. I had this problem last week (skipping a few databases) and it was solved by changing the cursor syntax. Best regards. |
Wednesday, December 31, 2014 - 8:01:16 AM - Greg Robidoux | Back To Top (35800) |
Hi jjj, the issue is probably with how you are referencing your server name -S.\TIMESAVER Did you try -S TIMESAVER |
Tuesday, December 30, 2014 - 6:11:28 PM - jjj | Back To Top (35790) |
ENV 2008r2 SqlExpress 2008r2 So I can run & successfully execute the script from SMSS , but when I try to run it from a batch file (which maybe the issue) These are teh contents o the batch file sqlcmd -S.\TIMESERVER -i"c:\SQLscripts\dAILYbACKUP.SQL"
AND I have also tried it with -U sa -P sapassword still the same error below TCP IP and named instance are enabled
C:\SQLSCRIPTS>sqlcmd -S.\TIMESERVER -i"c:\SQLscripts\dAILYbACKUP.SQL" TCP IP ie enabled, named instance enabled
|
Saturday, December 20, 2014 - 8:11:47 AM - Gaurang Bhadani | Back To Top (35700) |
Thanks for this article i hepls me very much thanks a lot |
Wednesday, October 29, 2014 - 12:22:42 PM - Greg Robidoux | Back To Top (35111) |
Hi Peter, you can use a UNC path instead of the drive letter as long as the SQL Server service account has rights to write to the folder this should work. As far as creating separate folders for each database, this gets a little tricky with this approach. You could use xp_cmdshell to create the folders if they do not already exist. As far as writing to the folder you would just need to change this line to: SET @fileName = @path + @name + '\' + @name + '_' + @fileDate + '.BAK' |
Wednesday, October 29, 2014 - 11:43:55 AM - Peter Thompsen | Back To Top (35110) |
How can I use SET @path = 'C:\Backup\ to specify a network drive? I'm getting an error when using Z:\DB_Backup\ I suppose its becasue the script doesn't have access to the share? |
Monday, October 6, 2014 - 8:41:16 AM - Greg Robidoux | Back To Top (34842) |
Hi Kahled, You could use SQLCMD and create a batch process to run every day. Take a look at this tip: http://www.mssqltips.com/sqlservertip/1543/using-sqlcmd-to-execute-multiple-sql-server-scripts/ -Greg |
Monday, October 6, 2014 - 5:48:18 AM - Khaled | Back To Top (34840) |
Hi! Thanks it work perfectly, but i must do a backup every day, so can i use a batch file (SQLBackup.bat) and put the commande into this file, after i'll use the planified tasks. thanks for all |
Thursday, September 25, 2014 - 1:55:20 AM - Shashikala | Back To Top (34707) |
Hi, I am facing one issue with this script. Job completed successfully,but backup happend only for one database not for all and no errors found. Note: Sometimes backup will happen successfully. What could be the reason here, please help.
Thanks Shashikala |
Saturday, September 6, 2014 - 5:24:44 AM - Bharat | Back To Top (34406) |
Hi Greg, Its awesome and great working. Thanks. Bharat.
|
Thursday, August 28, 2014 - 11:18:35 AM - Greg Robidoux | Back To Top (34320) |
Hi Cultti, glad you got this workding. Greg |
Thursday, August 28, 2014 - 10:28:13 AM - Cultti | Back To Top (34316) |
Hi Greg,
I was able to backup those databases that did not previously backup.
The largest succesfully backed database is 15Gb in size. |
Thursday, August 28, 2014 - 10:13:50 AM - Greg Robidoux | Back To Top (34315) |
Hi Cultti, Are the databases really large? I am not sure why it would not work. It is possible there is a query timeout. Can you test the 5 databases that did not work and hardcode them into the list of databases to backup: WHERE name IN ('Db1','Db2','Db3','Db4','Db5') -- include these databases
|
Thursday, August 28, 2014 - 9:41:34 AM - Cultti | Back To Top (34312) |
Sorry, I did not notice the sql that you gave me. Every database is online except one, it is recovery mode(dont know why). Can this cause problems? |
Thursday, August 28, 2014 - 9:38:38 AM - Cultti | Back To Top (34311) |
Hi Greg Robidoux,
Every database is online. When I do query with: SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb') AND DATABASEPROPERTYEX(name, 'status') != 'OFFLINE' 11 databases are listed in the result. There are no spaces in the names. I also run exact same query but with attribute "WITH DIFFERENTIAL" in backup cmd, there is no problem and every database diff file is generated. |
Thursday, August 28, 2014 - 9:11:51 AM - Greg Robidoux | Back To Top (34310) |
Hi Cultti, what is the status of the databases when you run this command. Are they all ONLINE? SELECT name, DATABASEPROPERTYEX(name, 'status')
Also, do any of your databases have spaces in the names? |
Thursday, August 28, 2014 - 8:35:12 AM - Cultti | Back To Top (34308) |
Any idea why script backups only first 6 databases when I have total 11 databases online? Bellow is my script. When I test the SELECT clause the result shows all 11 databases. However, last database that I backup takes 231 seconds. Is there possible timeout in jobs?
DECLARE @name VARCHAR(50) -- database name DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name
-- specify database backup directory SET @path = 'E:\Databases\Backups\'
-- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)
DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb') AND DATABASEPROPERTYEX(name, 'status') != 'OFFLINE'
OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0 BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.full.bak' BACKUP DATABASE @name TO DISK = @fileName
FETCH NEXT FROM db_cursor INTO @name END
CLOSE db_cursor DEALLOCATE db_cursor |
Tuesday, June 24, 2014 - 1:45:35 PM - Jon | Back To Top (32376) |
For some reason it cut off the second part of the script, so I'm posting again:
DECLARE @name VARCHAR(50), -- database name @path VARCHAR(256), -- path for backup files @fileName VARCHAR(256), -- filename for backup @fileDate VARCHAR(20), -- used for file name @backupCount INT CREATE TABLE [dbo].#tempBackup (intID INT IDENTITY (1, 1), name VARCHAR(200)) SET @path = 'C:\Backup\' + CAST(SERVERPROPERTY('MachineName') as nvarchar(64)) + '-' -- Includes the date in the filename --SET @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112) -- Includes the date and time in the filename --SET @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 108), ':', '') INSERT INTO [dbo].#tempBackup (name) SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') SELECT TOP 1 @backupCount = intID FROM [dbo].#tempBackup ORDER BY intID DESC IF ((@backupCount IS NOT NULL) AND (@backupCount > 0)) BEGIN DECLARE @currentBackup INT SET @currentBackup = 1 WHILE (@currentBackup <= @backupCount) BEGIN SELECT @name = name, --@fileName = @path + name + '_' + @fileDate + '.BAK' -- Unique FileName @fileName = @path + @name + '.BAK' -- Non-Unique Filename FROM [dbo].#tempBackup WHERE intID = @currentBackup -- does not overwrite the existing file BACKUP DATABASE @name TO DISK = @fileName WITH RETAINDAYS = 30, NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10 -- overwrites the existing file (Note: remove @fileDate from the fileName so they are no longer unique --BACKUP DATABASE @name TO DISK = @fileName WITH INIT --Verify each database after it is backed up declare @backupSetId as int select @backupSetId = position from msdb..backupset where database_name=@name and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=@name ) if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database @name not found.', 16, 1) end RESTORE VERIFYONLY FROM DISK = @fileName WITH FILE = @backupSetId, NOUNLOAD, NOREWIND SET @currentBackup = @currentBackup + 1 END END DROP TABLE [dbo].#tempBackup |
Tuesday, June 24, 2014 - 1:43:06 PM - Jon | Back To Top (32375) |
Thanks Greg and others for this very useful script. I've modified it to fit my purposes, specifically: 1. Include the 'Machinename' in the output file --e.g. SQLServer1-master.bak 2. Added some options to the backup process 3. Add a verify stage into the backup loop DECLARE @name VARCHAR(50), -- database name @path VARCHAR(256), -- path for backup files @fileName VARCHAR(256), -- filename for backup @fileDate VARCHAR(20), -- used for file name @backupCount INT CREATE TABLE [dbo].#tempBackup (intID INT IDENTITY (1, 1), name VARCHAR(200)) SET @path = 'C:\Backup\' + CAST(SERVERPROPERTY('MachineName') as nvarchar(64)) + '-' -- Includes the date in the filename --SET @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112) -- Includes the date and time in the filename --SET @fileDate = CONVERT(VARCHAR(20), GETDATE(), 112) + '_' + REPLACE(CONVERT(VARCHAR(20), GETDATE(), 108), ':', '') INSERT INTO [dbo].#tempBackup (name) SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('tempdb') SELECT TOP 1 @backupCount = intID FROM [dbo].#tempBackup ORDER BY intID DESC IF ((@backupCount IS NOT NULL) AND (@backupCount > 0)) BEGIN DECLARE @currentBackup INT SET @currentBackup = 1 WHILE (@currentBackup |
Thursday, April 24, 2014 - 9:37:10 AM - Greg Robidoux | Back To Top (30500) |
Hi Batista, are you using this script in a query window to do the backup or the SQL Server Management Studio backup GUI?
|
Thursday, April 24, 2014 - 5:14:40 AM - Batista | Back To Top (30494) |
Hi Greg, If the size of the database is small then there is no issue but once I try to take a fatty DB backup then my application is throwing an error message as shown below. I haven't tried to take backup of master database. There is no issue with filename. I used get the below error message whenever I tried to take backup of database having size more than 2 - 3 GB.
Error occured.. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The backup or restore was aborted |
Sunday, March 16, 2014 - 5:43:52 AM - Sameh Dewdar | Back To Top (29775) |
I face another issue with the script I try to making log backup 4 time per day using NOINIT option but every time it override the exist one , I think as it with same name I try to change on file name to be SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),108) but it always give me error , any idea |
Saturday, March 15, 2014 - 1:08:55 AM - malli | Back To Top (29771) |
sql server 2000 version old backups removed without using shrinke file db script , means only truncate using for the daily backups in server 2000, please provide the script in 2000. |
Saturday, March 15, 2014 - 1:00:45 AM - malli | Back To Top (29770) |
sql server 2000 version old backups removed without using shrinke file db script , means only truncate using for the daily backups in server 2000. |
Tuesday, March 11, 2014 - 9:20:39 AM - Greg Robidoux | Back To Top (29712) |
Hi Sameh, you are pretty much out of luck if you don't have a good MDF data file or a good backup. Greg |
Tuesday, March 11, 2014 - 9:12:08 AM - Sameh Dewdar | Back To Top (29711) |
thanks again for your help ,
i have another question not related to this topic but it's very urgent , I lose a DB due to RAID failure , i don't have mdf or backup I just have _log.ldf so what you suggest |
Tuesday, March 11, 2014 - 8:55:43 AM - Greg Robidoux | Back To Top (29708) |
Hi Sameh, you should not need to shrink the log file on a regular basis. This is something you should do as needed. After your a successful log backup you can shrink your transaction log files using DBCC SHRINKFILE. You can use DBCC sqlperf(logspace) to see how much of the transaction log is being used before a log backup occurs this way you have an idea of how much to shrink the file. If you are unsure a good rule would be to have the transaction log about 20-25% of the data file, but this really depends on how large the data files are and also how much space your transactions take between each log backup. |
Tuesday, March 11, 2014 - 7:44:47 AM - Sameh Dewdar | Back To Top (29707) |
Many Thanks Greg , i have another question , the ldf size is large on the DBs [ i have sql 2000 , 2005 , 2008] should i make truncate after full backup in case i take log backup , if ok , how could i do it via script. |
Monday, March 10, 2014 - 12:08:29 PM - Greg Robidoux | Back To Top (29688) |
Hi Sameh, You would just need to change this line to do differentials: From: BACKUP DATABASE @name TO DISK = @fileName To: BACKUP DATABASE @name TO DISK = @fileName WITH DIFFERENTIAL
For transaction log backups change this From: BACKUP DATABASE @name TO DISK = @fileName To: BACKUP LOG @name TO DISK = @fileName
You might also want to change your file extensions too as follows: SET @fileName = @path + @name + '_' + @fileDate + '.BAK' SET @fileName = @path + @name + '_' + @fileDate + '.DIF' SET @fileName = @path + @name + '_' + @fileDate + '.TRN'
You would need to create three different jobs and run these on different schedules.
|
Sunday, March 9, 2014 - 6:38:25 AM - Sameh Dewdar | Back To Top (29684) |
Could you please explain how to make the code work as Full , Diff and Log backup |
Wednesday, February 26, 2014 - 4:00:43 AM - sadiq | Back To Top (29577) |
Thanks sir |
Tuesday, February 25, 2014 - 11:43:08 AM - Greg Robidoux | Back To Top (29567) |
Hi Sadiq, there is not a way to backup individual tables with the native SQL Server backup commands. The above script will work for SQL 2008 R2 and will backup the entire database. |
Tuesday, February 25, 2014 - 4:20:43 AM - sadiq | Back To Top (29562) |
i want sql server 2008 R2 tables with data backup script |
Thursday, February 20, 2014 - 6:32:00 PM - Greg Robidoux | Back To Top (29520) |
Hi Batista, Does this work for any database? Did you try to just backup the master database? You can change your code and comment out the BACKUP DATABASE line and add this line PRINT @filename this way you can see what the @filename looks like to make sure it is valid.
|
Friday, February 14, 2014 - 7:16:57 AM - Batista | Back To Top (29448) |
Hi Greg, I am using the below scipt while taking the backup, but script is throwing error as Error occured.. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. The backup or restore was aborted. ============================================================================== ALTER PROCEDURE [dbo].[CreateDBBackup] @name VARCHAR(50), -- database name @path VARCHAR(256), -- path for backup files @fileDate VARCHAR(20) -- used for file name AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @fileName VARCHAR(256) -- specify filename format SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) + '_' + REPLACE(CONVERT(VARCHAR(20),GETDATE(),108),':','')
BEGIN SET @fileName = @path + @name + '_' + @fileDate + '.bak' BACKUP DATABASE @name TO DISK = @fileName
END |
Tuesday, January 7, 2014 - 8:56:30 AM - amg | Back To Top (27978) |
Great article...not sure if this is a good idea or not, but in our environment we store all the backups to a san. Is it possible to get the script to use either a list of servers from a command shell osql -L (or better yet, how would I do that internally from the server without xp_cmdshell?), backup all the dbs and point the backups to paths on the san named after the server /dbname? Could similar be using the list of linked servers? Thanks very much, this was a great thread.
|
Monday, January 6, 2014 - 6:20:28 AM - PRITESH | Back To Top (27965) |
Thanks .. Nice Information |
Thursday, January 2, 2014 - 3:31:33 PM - Greg Robidoux | Back To Top (27940) |
Hi Carinne, it looks like compression was added in SQL Server 2008 R2 for the standard edition. http://technet.microsoft.com/en-us/library/bb964719(v=sql.105).aspx |
Friday, December 27, 2013 - 5:58:35 AM - Carinne | Back To Top (27892) |
Forgot to mention that i'm using SQL Server 2008, 64bits When i tried to run BACKUP DATABASE @name TO DISK = @fileName WITH COMPRESSION, INIT, STATS=10 I got the error message as follow:
BACKUP DATABASE WITH COMPRESSION is not supported on Standard Edition (64-bit). Msg 3013, Level 16, State 1, Line 31 BACKUP DATABASE is terminating abnormally.
Thank you. Carinne (Newbie)
|
Friday, December 27, 2013 - 5:31:49 AM - Carinne | Back To Top (27891) |
Hi Greg, I would like to ask if I want my DB to be compressed and at the same time the DB can be overwrited. How can I combine it? BACKUP DATABASE @name TO DISK = @fileName WITH INIT (Currently am using this only) BACKUP DATABASE @name TO DISK = @fileName WITH COMPRESSION
Thank you. Carinne (Newbie) |
Monday, December 16, 2013 - 10:28:41 AM - Greg Robidoux | Back To Top (27808) |
Sunil, just change this line:
to see this tip for more info about backup compression: https://www.mssqltips.com/sqlservertip/1964/sql-server-2008-backup-compression/ |
Monday, December 16, 2013 - 7:26:49 AM - Sunil | Back To Top (27807) |
Is it possible to include the compression option in the script provided by Greg, in this article, if so can someone send me the modified script with compression option.
Thanks! |
Monday, December 16, 2013 - 7:24:38 AM - Sunil | Back To Top (27806) |
Hi, Can anyone provide me script for backup of all databases with the Compression option for sql servers 2012 instance.
|
Sunday, November 3, 2013 - 11:52:44 AM - Ger Versteeg | Back To Top (27377) |
Hi Greg, I hope you have a nice Sunday. Here you see a part of my result: 002 Now you can see what I mean with 'skip the path of the database on E:\'. Best regards, Ger PS. sorry for my bad English, I'am from The Netherlands
|
Sunday, November 3, 2013 - 9:27:52 AM - Greg Robidoux | Back To Top (27376) |
@Ger - if you run this query what information is returned?
SELECT name
This should only have the database name not the path. |
Saturday, November 2, 2013 - 3:35:05 PM - Ger Versteeg | Back To Top (27375) |
Hello, I have problem with @name from my database @name is the full path of the database e.g. 'D:\content\clientname\system\db\databasename'. How can I strip the path from @name into e.g. in @singleName so I change: SET @fileName = @path + @singleName + '_' + @fileDate + '.BAK' Who know a solution for this. Thanks, Ger
|
Wednesday, September 25, 2013 - 9:34:07 AM - Greg Robidoux | Back To Top (26931) |
What is the share name you are backing up to. You may just need a \ after backup. |
Wednesday, September 25, 2013 - 5:23:09 AM - scribepl | Back To Top (26928) |
i want to do backup on network share but i hav this massage:
Cannot open backup device '\\plik\backupDB1_20130925.BAK'. Operating system error 53(failed to retrieve text for this error. Reason: 15105).
in script i change only this: -- specify database backup directory SET @path = 'C:\Backup\' to -- specify database backup directory
|
Tuesday, September 10, 2013 - 1:58:58 PM - Stephen | Back To Top (26713) |
@Greg - Thank you very much, just tried it and everything worked well. This page has made my day, from frustrated to cloud nine just like that. |
Tuesday, September 10, 2013 - 1:49:44 PM - Greg Robidoux | Back To Top (26711) |
@Stephen - yes you could use that code or use the original code from the tip. Just change these lines: SET @fileName = @path + @name + '_' + @fileDate + '.BAK' To this: |
Tuesday, September 10, 2013 - 1:23:22 PM - Stephen | Back To Top (26709) |
Could the code posted by sullivrp also be used to backup transaction logs? |
Tuesday, September 10, 2013 - 11:50:56 AM - Stephen | Back To Top (26708) |
@Kevin - Thanks! I just created it to run at 11:42am and it is currently in progress. This is literally the best thing since sliced bread. Thank you for the quick response! |
Tuesday, September 10, 2013 - 11:09:31 AM - Kevin | Back To Top (26706) |
@Stephen - you should just be able to paste the code into a SQL Job step and setup a schedule.
It looks like the job did not run based on your comments. Check the job schedule again to make sure you didn't use the current day when setting it up which would have been in the past. |
Tuesday, September 10, 2013 - 10:56:57 AM - Stephen | Back To Top (26703) |
This worked like a charm, and it was easy to just paste it into a query window. I am an ametuer when it comes to SQl so thanks a lot everyone who contributed here! But I was wanting to make this into a scheduled task using the Server Agent and I'm not quite confident on what steps I should take to do this. I tried creating a test job yesterday that would run at 2am, but when I checked it this morning I did not see where the job had run, the file had not been placed in the back up location. |
Tuesday, August 27, 2013 - 6:50:45 AM - Gunawan | Back To Top (26492) |
Thank you Very much , I'm from Indonesian... This Article very Helpfull .. |
Monday, August 26, 2013 - 5:50:02 AM - Johannes | Back To Top (26479) |
Hi! Thanks a lot for the script, works great! |
Monday, July 29, 2013 - 11:02:20 AM - Greg Robidoux | Back To Top (26048) |
@Alvin - you could create multiple backup copies using the mirrored backup option. Take a look at this tip: |
Monday, July 29, 2013 - 9:48:47 AM - Alvin | Back To Top (26046) |
How about doing the same script but instead having multiple backup files for each database with each execution.
i.e Database1_01.bak Database1_02.bak
Database2_01.bak Database2_02.bak |
Wednesday, June 26, 2013 - 10:47:25 AM - Greg Robidoux | Back To Top (25575) |
@Naveed - this script just creates the backup files. You need to make sure the directory exists before running. |
Wednesday, June 26, 2013 - 2:24:22 AM - NAVEED | Back To Top (25568) |
I have run the same script but no folder created in my C drive... why??? |
Tuesday, April 23, 2013 - 3:23:17 PM - Shile | Back To Top (23528) |
Hi Greg, Thanks again and btw my machine is a sql2008r2 ent. I look at those links and im not sure thats how i'd like to acheive this setup. I also found 2 extra scripts that seemed to have been written for earlier versions of sql server and was wondering if you could do any modification to those. Im also not sure whether to ask this here or on your restore tip page. Restore all Databases in a Directory
SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_CSS_RestoreDir]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[sp_CSS_RestoreDir] GO
/***************************************************************************************/ -- Procedure Name: sp_CSS_RestoreDir -- Purpose: Restore one or many database backups from a single directory. This script reads all --database backups that are found in the @restoreFromDir parameter. --Any database backup that matches the form %_db_% will be restored to --the file locations specified in the RestoreTo... parameter(s). The database --will be restored to a database name that is based on the database backup --file name. For example Insurance_db_200305212302.BAK will be restored to --a database named Insurance. The characters preceeding the '_db_' text determines --the name. -- -- Input Parameters: @restoreFromDir - The directory where the database backups are located --@restoreToDataDir - The directory where the data files (i.e. MDF) will be restored to --@restoreToLogDir - The directory where the log files (i.e. LDF) will be restored to. If --this parameter is not provided then the log files are restored to @restoreToDataDir. -- @MatchFileList - set to 'Y' to restore to same directory structure contained in the backup, -- also allows for secondary data files 'ndf' to to be in a different dir than mdf files -- @DBName - restore just this one database - selects the latest bak file -- -- Output Parameters: None -- -- Return Values: -- -- Written By: Chris Gallelli -- 8/22/03 -- Modified By: -- Modifications: Bruce Canaday -- 10/20/2003 -- Added optional parameters @MatchFileList and @DBName -- Bruce Canaday -- 10/24/2003 -- Get the db name as the characters LEFT of the right most '_db_' in the bak filenaame -- This is to handle databases such as ALIS_DB -- Bruce Canaday -- 10/28/2003 -- When using @MatchFileList = 'Y' attempt to create any directory that doesn't exist -- Bruce Canaday -- 11/04/2003 -- Allow spaces in the @restoreFromDir directory name -- -- Sample Execution: exec sp_CSS_RestoreDir 'C:\sqldb\sql_backup', 'C:\sqldb\sql_data', 'C:\sqldb\sql_log' -- -- Alternate Execution: exec sp_CSS_RestoreDir 'C:\sqldb\sql_backup', @MatchFileList = 'Y' -- -- Reviewed By: -- /***************************************************************************************/
CREATE proc sp_CSS_RestoreDir @restoreFromDir varchar(255), @restoreToDataDir varchar(255)= null, @restoreToLogDir varchar(255) = null, @MatchFileList char(1) = 'N', @OneDBName varchar(255) = null as
--If a directory for the Log file is not supplied then use the data directory If @restoreToLogDir is null set @restoreToLogDir = @restoreToDataDir
set nocount on
declare @filename varchar(40), @cmd varchar(500), @cmd2 varchar(500), @DataName varchar (255), @LogName varchar (255), @LogicalName varchar(255), @PhysicalName varchar(255), @Type varchar(20), @FileGroupName varchar(255), @Size varchar(20), @MaxSize varchar(20), @restoreToDir varchar(255), @searchName varchar(255), @DBName varchar(255), @PhysicalFileName varchar(255)
create table #dirList (filename varchar(100)) create table #filelist (LogicalName varchar(255), PhysicalName varchar(255), Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20) )
--Get the list of database backups that are in the restoreFromDir directory if @OneDBName is null select @cmd = 'dir /b /on "' +@restoreFromDir+ '"' else select @cmd = 'dir /b /o-d /o-g "' +@restoreFromDir+ '"'
insert #dirList exec master..xp_cmdshell @cmd
select * from #dirList where filename like '%_db_%' --order by filename
if @OneDBName is null declare BakFile_csr cursor for select * from #dirList where filename like '%_db_%bak' order by filename else begin -- single db, don't order by filename, take default latest date /o-d parm in dir command above select @searchName = @OneDBName + '_db_%bak' declare BakFile_csr cursor for select top 1 * from #dirList where filename like @searchName end
open BakFile_csr fetch BakFile_csr into @filename
while @@fetch_status = 0 begin select @cmd = "RESTORE FILELISTONLY FROM disk = '" + @restoreFromDir + "\" + @filename + "'"
insert #filelist exec ( @cmd )
if @OneDBName is null select @dbName = left(@filename,datalength(@filename) - patindex('%_bd_%',reverse(@filename))-3) else select @dbName = @OneDBName
select @cmd = "RESTORE DATABASE " + @dbName + " FROM DISK = '" + @restoreFromDir + "\" + @filename + "' WITH "
PRINT '' PRINT 'RESTORING DATABASE ' + @dbName
declare DataFileCursor cursor for select LogicalName, PhysicalName, Type, FileGroupName, Size, MaxSize from #filelist
open DataFileCursor fetch DataFileCursor into @LogicalName, @PhysicalName, @Type, @FileGroupName, @Size, @MaxSize
while @@fetch_status = 0 begin if @MatchFileList != 'Y' begin -- RESTORE with MOVE option select @PhysicalFileName = reverse(substring(reverse(rtrim(@PhysicalName)),1,patindex('%\%',reverse(rtrim(@PhysicalName)))-1 ))
if @Type = 'L' select @restoreToDir = @restoreToLogDir else select @restoreToDir = @restoreToDataDir
select @cmd = @cmd + " MOVE '" + @LogicalName + "' TO '" + @restoreToDir + "\" + @PhysicalFileName + "', " end else begin -- Match the file list, attempt to create any missing directory select @restoreToDir = left(@PhysicalName,datalength(@PhysicalName) - patindex('%\%',reverse(@PhysicalName)) ) select @cmd2 = "if not exist " +@restoreToDir+ " md " +@restoreToDir exec master..xp_cmdshell @cmd2 end
fetch DataFileCursor into @LogicalName, @PhysicalName, @Type, @FileGroupName, @Size, @MaxSize
end -- DataFileCursor loop
close DataFileCursor deallocate DataFileCursor
select @cmd = @cmd + ' REPLACE' --select @cmd 'command' EXEC (@CMD)
truncate table #filelist
fetch BakFile_csr into @filename
end -- BakFile_csr loop
close BakFile_csr deallocate BakFile_csr
drop table #dirList
return GO
SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
Automatically Restores All database .BAK Files
/************************************************************* Script made by : Lester A. Policarpio Email Address : [email protected] Date Created : September 03, 2007 --=UPDATES=--
January 17, 2008 - Solved outputed value of the @restoredb variable - Solved the "invalid length parameter" issue
May 6, 2008 - Removed unused variables - Add the headeronly command to accept non sql backup format (dbname_db_YYYYMMDDHHMM.BAK) - Add more comments
May 12, 2008 - Accept Backup Files With Multiple NDFs
May 23, 2008 - Solved the problem when RESTORE HEADERONLY produces more than 1 value
--=LIMITATIONS=-- - This script is tested for backup files ".BAK" only -- SCRIPT NEEDS TO BE ALTERED IF BACKUP EXTENSION IS NOT ".BAK" *************************************************************/ SET NOCOUNT ON --Drop Tables if it exists in the database if exists (select name from sysobjects where name = 'migration_lester') DROP TABLE migration_lester if exists (select name from sysobjects where name = 'header_lester') DROP TABLE header_lester if exists (select name from sysobjects where name = 'cmdshell_lester') DROP TABLE cmdshell_lester
--Create Tables --(cmdshell_lester table for the cmdshell command) --(migration_lester table for the restore filelistonly command) --(header_lester table for the restore headeronly command) CREATE TABLE cmdshell_lester( fentry varchar(1000))
CREATE TABLE migration_lester(LogicalName varchar(1024), PhysicalName varchar(4000),type char(1),FileGroupName varchar(50), size real,MaxSize real)
CREATE TABLE header_lester (BackupName varchar(50), BackupDescription varchar(100),BackupType int, ExpirationDate nvarchar(50),Compressed int,Position int, DeviceType int,UserName varchar(30),ServerName varchar(30), DatabaseName varchar(50),DatabaseVersion int, DatabaseCreationDate datetime,BackupSize bigint,FirstLsn binary, LastLsn binary,CheckpointLsn binary,DifferentialBasLsn binary, BackupStartDate datetime,BackupFinishDate datetime,SortOrder int, CodePage int,UnicodeLocaleid int,UnicodeComparisonStyle int, CompatibilityLevel int,SoftwareVendorId int,SoftwareVersionMajor int, SoftwareVersionMinor int,SoftwareVersionBuild int, MachineName varchar(50),Flags int,BindingId nvarchar(50), RecoveryForkId nvarchar(50),Collation nvarchar(50))
--Declare Variables DECLARE @path varchar(1024),@restore varchar(1024) DECLARE @restoredb varchar(2000),@extension varchar(1024),@newpath_ldf varchar(1024) DECLARE @pathension varchar(1024),@newpath_mdf varchar(1024),@header varchar(500)
--Set Values to the variables SET @newpath_mdf = 'C:\' --new path wherein you will put the mdf SET @newpath_ldf = 'D:\' --new path wherein you will put the ldf SET @path = 'D:\' --Path of the Backup File SET @extension = 'BAK' SET @pathension = 'dir /OD '+@Path+'*.'+@Extension
--Insert the value of the command shell to the table INSERT INTO cmdshell_lester exec master..xp_cmdshell @pathension --Delete non backup files data, delete null values DELETE FROM cmdshell_lester WHERE FEntry NOT LIKE '%.BAK%' DELETE FROM cmdshell_lester WHERE FEntry is NULL --Create a cursor to scan all backup files needed to generate the restore script DECLARE @migrate varchar(1024) DECLARE migrate CURSOR FOR select substring(FEntry,40,50) as 'FEntry'from cmdshell_lester OPEN migrate FETCH NEXT FROM migrate INTO @migrate WHILE (@@FETCH_STATUS = 0)BEGIN --Added feature to get the dbname of the backup file SET @header = 'RESTORE HEADERONLY FROM DISK = '+''''+@path+@Migrate+'''' INSERT INTO header_lester exec (@header) --Get the names of the mdf and ldf set @restore = 'RESTORE FILELISTONLY FROM DISK = '+''''+@path+@migrate+'''' INSERT INTO migration_lester EXEC (@restore) --Update value of the table to add the new path+mdf/ldf names UPDATE migration_lester SET physicalname = reverse(physicalname) UPDATE migration_lester SET physicalname = substring(physicalname,1,charindex('\',physicalname)-1)
UPDATE migration_lester SET physicalname = @newpath_mdf+reverse(physicalname) where type = 'D' UPDATE migration_lester SET physicalname = @newpath_ldf+reverse(physicalname) where type = 'L' --@@@@@@@@@@@@@@@@@@@@ --Set a value to the @restoredb variable to hold the restore database script IF (select count(*) from migration_lester) = 2 BEGIN SET @restoredb = 'RESTORE DATABASE '+(select top 1 DatabaseName from header_lester) +' FROM DISK = '+ ''''+@path+@migrate+''''+' WITH MOVE '+'''' +(select logicalname from migration_lester where type = 'D')+'''' +' TO '+ ''''+( select physicalname from migration_lester WHERE physicalname like '%mdf%') +''''+', MOVE '+''''+ (select logicalname from migration_lester where type = 'L') +''''+' TO '+''''+( select physicalname from migration_lester WHERE physicalname like '%ldf%')+'''' print (@restoredb) END
IF (select count(*) from migration_lester) > 2 BEGIN SET @restoredb = 'RESTORE DATABASE '+(select top 1 DatabaseName from header_lester)+ ' FROM DISK = '+''''+@path+@migrate+''''+'WITH MOVE ' DECLARE @multiple varchar(1000),@physical varchar(1000) DECLARE multiple CURSOR FOR Select logicalname,physicalname from migration_lester OPEN multiple FETCH NEXT FROM multiple INTO @multiple,@physical WHILE(@@FETCH_STATUS = 0) BEGIN SET @restoredb=@restoredb+''''+@multiple+''''+' TO '+''''+@physical+''''+','+'MOVE '+'' FETCH NEXT FROM multiple INTO @multiple,@physical END CLOSE multiple DEALLOCATE multiple SET @restoredb = substring(@restoredb,1,len(@restoredb)-5) print (@restoredb) END
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -- Run print @restoredb first to view the databases to be restored -- When ready, run exec (@restoredb) -- EXEC (@restoredb)
--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ --Clear data inside the tables to give way for the next --set of informations to be put in the @restoredb variable TRUNCATE TABLE migration_lester TRUNCATE TABLE header_lester FETCH NEXT FROM migrate INTO @migrate END CLOSE migrate DEALLOCATE migrate --@@@@@@@@@@@@@@@@@@@
--Drop Tables DROP TABLE migration_lester DROP TABLE cmdshell_lester DROP TABLE header_lester =====================================
I get errors on this second one ....Msg 213, Level 16, State 7, Line 1
Column name or number of supplied values does not match table definition.
|
Tuesday, April 23, 2013 - 10:36:46 AM - Greg Robidoux | Back To Top (23522) |
@shile - yes you can do DIFFERENTIAL backups as well. Just change this line BACKUP DATABASE @name TO DISK = @fileName to BACKUP DATABASE @name TO DISK = @fileName WITH DIFFERENTIAL See this for more info: http://www.mssqltips.com/sqlservertutorial/9/sql-server-differential-backups/ |
Tuesday, April 23, 2013 - 10:13:43 AM - Greg Robidoux | Back To Top (23520) |
@shile - if you are using SQL Server Standard or Enterprise you can use SQL Server Agent jobs to do the backup and restore. If you are using SQL Server Express you can setup a Windows Scheduled Task. Take a look at these tips: https://www.mssqltips.com/sqlservertip/2842/how-to-automate-sql-server-restores-for-a-test-server/ https://www.mssqltips.com/sqlservertip/1174/scheduling-backups-for-sql-server-express/ |
Tuesday, April 23, 2013 - 10:11:18 AM - Shile | Back To Top (23519) |
Also, can full or differential backup options be added this script? Thanks |
Tuesday, April 23, 2013 - 9:59:26 AM - Shile | Back To Top (23515) |
Hi Greg, So, I found out why it was failing and you were right on the money about the entire name of the database. The database name (DECLARE @name VARCHAR(50) -- database name) was set to 50 and most of these SharePoint Configuration databases have names longer than 50 characters(the longest have is 80 characters WebAnalyticsServiceApplication_ReportingDB_356b2d44-71e9-4e3e-979d-29242bc36110) so, I set it to 150 and all works now. And on the second part of my question from yesterday, whats the best way to automate this backup and the restore nightly? Thanks. |
Monday, April 22, 2013 - 3:35:03 PM - Greg Robidoux | Back To Top (23493) |
@Shile - what SQL Server version are you using? Also, what is the entire name of the database that is failing? I tried to create some dummy databases based on what you show and it worked fine in SQL 2012. |
Monday, April 22, 2013 - 2:45:18 PM - Shile | Back To Top (23491) |
I forgot to include the exact errors... Database 'SharePoint_AdminContent_c4d97e78...' does not exist. Make sure that the name is entered correctly. Msg 3013, Level 16, State 1, Line 31
Thanks. |
Monday, April 22, 2013 - 2:36:12 PM - Shile | Back To Top (23490) |
Hi, Very useful script here. I am in a situation where I'd like to backup all production databases(SharePoint2010 & inhouse app dbs) from on server say, SQL1 to another server SQL2 nightly and then restore them to this other server. I was gonna use this to do the backups and then this as a maintenace job to restore(haven't totally figured it out the entire process though) Running the t-sql provided here gives me errors on just the SharePoint configuration dbs(Search_Service_Application_PropertyStoreDB, SharePoint_AdminContent_... and a couple more). The backup location is shared on the SQL2 and all other dbs backups got there no problem. So, question is...how to fix this error and if there are other ways of achieving my goal? Thanks |
Thursday, March 7, 2013 - 9:11:52 AM - Greg Robidoux | Back To Top (22633) |
@Sahul - take a look at this tip: https://www.mssqltips.com/sqlservertip/1596/sql-server-backup-history-analysis/ |
Thursday, March 7, 2013 - 8:57:07 AM - Sahul | Back To Top (22630) |
Hi, Please get me a script for... How to Find Last Backup Time for All Databases in sql server 2005 ? |
Tuesday, March 5, 2013 - 11:05:00 AM - sulaak | Back To Top (22575) |
@ noel you can retain database using the command below WITH RETAINDAYS = 14, NOFORMAT, NOINIT,SKIP, REWIND, NOUNLOAD |
Friday, February 15, 2013 - 2:31:09 PM - fergie348 | Back To Top (22165) |
Thanks guys - really helpful.. |
Thursday, January 24, 2013 - 9:34:48 AM - Greg Robidoux | Back To Top (21680) |
@Tahir - do you get any error messages? |
Wednesday, January 23, 2013 - 5:21:12 AM - Tahir Hassan | Back To Top (21640) |
i did all the steps and were able to open it sql server but that is not executing the above script |
Thursday, January 3, 2013 - 3:41:38 AM - Erik | Back To Top (21242) |
This is a free tool that can help you too. I developed and is realible. http://www.sqlserverbooster.com |
Friday, November 16, 2012 - 8:22:06 AM - Greg Robidoux | Back To Top (20376) |
@Imtiaz Hussain - you can make the following change in the script to include a Network Share instead. Just make sure that SQL Server has permissions to write to this Network Share. so change this -- specify database backup directory to something like this and put in your ServerName and ShareName -- specify database backup directory |
Friday, November 16, 2012 - 2:12:35 AM - Imtiaz Hussain | Back To Top (20371) |
How i can backup the Database from server to on a Network PC. |
Monday, November 5, 2012 - 1:34:04 AM - Ganeshan Nadarajan | Back To Top (20212) |
With the use of T-SQL you can generate your backup commands and with the use of cursors you can cursor through all of your databases to back them up one by one. This is a very straight forward process and you only need a handful of commands to do this. |
Wednesday, October 24, 2012 - 8:55:04 AM - Greg Robidoux | Back To Top (20069) |
@Sebastian - you can create a SQL Agent job and just paste this code into a T-SQL job step. If you are using SQL Express you can created a Windows Scheduled Task. Take a look at these tips for more information on creating a backup plan for SQL Server Express: https://www.mssqltips.com/sqlservertip/1174/scheduling-backups-for-sql-server-2005-express/ |
Tuesday, October 23, 2012 - 6:06:43 PM - sebastian wolter | Back To Top (20060) |
how can i put all this code into a job to be run automatically everyday ???
thanks you
swolter |
Wednesday, October 17, 2012 - 3:39:30 AM - appu | Back To Top (19950) |
this script is working fine if I execute it manually.when I scheduled it,it skips databases.i am using this script to take backup of master and msdb databases.backup of msdb database is missing when script is scheduled. |
Monday, October 8, 2012 - 9:04:16 AM - Greg Robidoux | Back To Top (19819) |
@jay - you can just use the script in the tip above. The scripts in the comments are just variations of the original script. Also, take a look at this tutorial: https://www.mssqltips.com/sqlservertutorial/1/sql-server-backup-options-and-commands-tutorial/ |
Sunday, October 7, 2012 - 10:21:02 PM - jay | Back To Top (19814) |
which one is correct for making script of database backup...guide me because im Newbie..thanks for the help! God Bless Us.....
|
Monday, October 1, 2012 - 10:53:44 AM - Pinakin | Back To Top (19754) |
Thanks for your reply Greg :)
|
Thursday, September 27, 2012 - 12:38:01 PM - Greg Robidoux | Back To Top (19716) |
@Pinakin - yes this should work for SQL 2000 as well. |
Thursday, September 27, 2012 - 11:50:42 AM - Pinakin | Back To Top (19711) |
Hi Greg, This script also work in Microsoft SQL Server 2000 - 8.00.2194 (Intel X86) Apr 20 2006 15:48:56 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.2 (Build 3790: Service Pack 2) or not boz I am upgrading from sql server 2000 Desktop Engine to SQL server 2008R and I have around 120 DB's on that server. I need to take backup all databases using this script. or I have take backup one by one database? I not able to test this script boz I have only SQl Desktop Engine in Pro. so pelase give me advise about this...
Thanks, Pinakin |
Monday, September 17, 2012 - 9:32:32 AM - Sugath | Back To Top (19532) |
Great script man.... good work... |
Friday, August 31, 2012 - 11:25:50 AM - george | Back To Top (19346) |
This script is great thanks.
how could I schedule this so it does this every Sunday?
thanks |
Friday, August 10, 2012 - 12:04:29 PM - Indrajeet | Back To Top (18991) |
It is awesome script, it so usefull for me. |
Sunday, June 24, 2012 - 1:59:12 PM - hamidreza | Back To Top (18187) |
Hi i want compare sql databse with backup via T-SQL? |
Monday, May 21, 2012 - 5:37:13 AM - Nishant | Back To Top (17564) |
Greetings, In my job i have to create backup everyday by using isql commands in command prompt....these are the commands i used 1)d: 2)cd medical_backup* (*folder name) 3)isql -Usa -P*(username and password) 4)dump database medical to"d:\medical_backup\medical_date*.dmp" (*current date) 5)go Could u pls tell me the script so that i can schedule that script and it will run automatically everyday..... thank you
|
Sunday, May 20, 2012 - 11:48:26 AM - Kuldeep | Back To Top (17558) |
Hi, It was a great script in deed.How do i use this script to automate the backup so that it runs on its own. Thanks ! |
Friday, April 27, 2012 - 11:32:53 AM - John J MArtinez | Back To Top (17159) |
Super! |
Friday, April 20, 2012 - 3:55:39 PM - Jeff Simpson | Back To Top (17025) |
Here is why some databases are skipped if you use a cursor. Assume you have two jobs a full backup and a log backup. The full backup starts at 3:15AM. The log backup starts at 4:15 and runs hourly until 2:15AM. The databases have grown and now the full backups take over an hour. Since @@FETCH_STATUS is a global variable, both jobs are going to use it. The log backup isn't going to back up a database if the full back up is still running. Since the log backups are going to finish faster than the full backup, this is going to cause @@FETCH_STATUS to return -1. The full back up job uses the global @@FETCH_STATUS which is now -1 and ends the loop. This is why some days there will be full backups and other days there won't. On the servers where the full databases finish before the log back up job starts, all of the databases are probably backed up every day. It is a matter of timing. In fact, it doesn't even have to be the log backup job. Anything that changes @@FETCH_STATUS could be culprit. Another example of why cursors are evil. |
Thursday, April 5, 2012 - 3:24:39 AM - Rajesh | Back To Top (16781) |
Hai, Thanks a lot. It was really helpful to me Thnak you so much. |
Saturday, March 24, 2012 - 8:53:30 AM - Greg Robidoux | Back To Top (16599) |
Kumar - you can replace this query in the scrip: SELECT name with this query which will only backup online databases and also databases that are not snapshots SELECT name |
Friday, March 23, 2012 - 10:27:24 PM - Kumar | Back To Top (16597) |
Hi,
We need to exclude the Snapshot database name from the script as weel as it will fail for Snapshot DB . We can see similar error while executing the script.
Msg 3002, Level 16, State 1, Line 21
Cannot BACKUP or RESTORE a database snapshot.
Msg 3013, Level 16, State 1, Line 21
BACKUP DATABASE is terminating abnormally.
Thanks, Kumar |
Monday, March 12, 2012 - 12:04:14 PM - Greg Robidoux | Back To Top (16349) |
Noel, take a look at these tips to see if you can create a new process or integrate the delete process into this script. https://www.mssqltips.com/sqlservertip/1324/maintenance-task-to-delete-old-sql-server-backup-files/ https://www.mssqltips.com/sqlservertip/1618/using-the-forfiles-command-to-delete-sql-server-backups/ |
Monday, March 12, 2012 - 11:22:34 AM - Noel | Back To Top (16348) |
Hi Having used this code for a number of years now, I still have a small problem. Is is possible to extend the script to delete backups after a certain period of time. |
Sunday, March 11, 2012 - 3:05:24 PM - Byron | Back To Top (16338) |
Greg, I truly appreciate how you are helping us all! Byron |
Saturday, March 10, 2012 - 6:26:42 AM - Greg Robidoux | Back To Top (16334) |
Hi Byron, yes you can use the WAITFOR comand to delay between steps. See this tip: |
Friday, March 9, 2012 - 10:09:52 PM - Byron | Back To Top (16332) |
Thanks for this thread. Is there a way to add a "timeout" (a pause) into the code, so that after each file is backed up, the process pauses for perhaps 5 minutes? Why? Because I am trying to backup to a SQL "backup device" (server object) that points to a .bak file located in "Amazon Cloud S3 storage". It seems that the SQL backup process moves too fast, and the remote backup location can't "keep up" (I get "backup file improperly formatted" and "corrupt header" errors). I know my code is correct, because if I change my SQL "backup device" to point to a local .bak file, everything works great. Thanks to all of you that contributed!! |
Friday, March 9, 2012 - 9:09:33 AM - Sasha | Back To Top (16316) |
Hi Greg, thank you very much! |
Friday, March 9, 2012 - 8:21:23 AM - Greg Robidoux | Back To Top (16313) |
Sasha, take a look at this KB article on moving logins between servers: http://support.microsoft.com/kb/918992 If you follow the above steps in this link the users will be mapped correctly once you restore the databases on the new server. |
Friday, March 9, 2012 - 8:18:09 AM - Greg Robidoux | Back To Top (16312) |
Bob, add this line of code to the script after the BACKUP DATABASE command. This will do a verify for each backup file that is created. RESTORE VERIFYONLY FROM DISK = @fileName |
Friday, March 9, 2012 - 7:34:15 AM - Sasha | Back To Top (16311) |
Hello, thank you for the script. It works perfect within single server but when we try to move DB to the other brand new server there are issues with security because the new server doesn't have the same users and logins. Is there a way to backup logins and relationship between users and logins in order to restore all at the new server?
Thank you so much. |
Thursday, March 8, 2012 - 10:38:55 AM - Bob | Back To Top (16300) |
How to modify this script to also do verification after each database ? |
Friday, March 2, 2012 - 10:21:54 PM - Byron | Back To Top (16240) |
Gone are the days of needing to manually maintain my scheduled "backup all db" script when databases are added or removed. THANK you all !!!! Great thread. |
Wednesday, January 18, 2012 - 6:36:31 AM - Upendra Gupta | Back To Top (15692) |
Thankyou sir.. |
Thursday, January 5, 2012 - 4:33:01 PM - chico | Back To Top (15526) |
nm figured it out |
Tuesday, January 3, 2012 - 5:46:55 PM - chico | Back To Top (15509) |
i was wondering, where do you insert a try catch in the backup script above ? |
Monday, June 27, 2011 - 6:21:38 AM - Nick F | Back To Top (14091) |
Thanks for the swift reply :) We've noticed this behaviour over the last few weeks (we monitor the behaviour of 200+ servers...), and came to the conclusion that it had something to do with the cursor - but can't figure out what! It wouldn't have been so much of an issue if the job would fail when a database is 'skipped'!! <grrr> Now we're in the process of re-writting the backup jobs (that use this cursor method) and changing over to the temp. table method. |
Monday, June 27, 2011 - 6:10:09 AM - yarick123 | Back To Top (14090) |
Nick F, right by this reason I use the "no cursor" version of the script. But I wunder also, why this behaviour occurs. |
Monday, June 27, 2011 - 5:53:42 AM - Nick F | Back To Top (14089) |
Just found this thread - very interesting & nice to know that we are doing things properly :) A quick question - using the cursor script we have found that it appears to skip over databases for no readily apparent reason - does anyone know why this behaviour occurs? |
Friday, March 18, 2011 - 2:19:25 PM - Greg Robidoux | Back To Top (13253) |
Você é muito bem-vindos. |
Friday, March 18, 2011 - 12:22:57 PM - Guilherme | Back To Top (13252) |
Obrigado. Diretamente do Brasil. O seu script foi muito útil para mim. Obrigado. Att. Guilherme |
Monday, January 10, 2011 - 12:06:13 AM - John | Back To Top (12548) |
Thanks Guys, I found the solution which was about adding permissions of SQL Agent user (local) to the backup folder. Thanks again |
Sunday, January 9, 2011 - 11:41:42 PM - John | Back To Top (12547) |
Dear Greg and sullivrp I am geting and error as access denaid as below:
(1 row(s) affected) Msg 3201, Level 16, State 1, Line 29 Cannot open backup device 'D:\EMS.BAK'. Operating system error 5(Access is denied.). Msg 3013, Level 16, State 1, Line 29 BACKUP DATABASE is terminating abnormally. Please help me in this |
Thursday, September 23, 2010 - 4:48:19 PM - Greg | Back To Top (10200) |
You can add this extra line to the WHERE clause to only include databases that are ONLINE. SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb') AND DATABASEPROPERTYEX(name, 'status') = 'ONLINE' |
Thursday, September 23, 2010 - 3:57:01 PM - Evert | Back To Top (10199) |
Hi all, Thank you for these useful and easy to understand suggestions and additions. However, I need one more/other... How do I make this script so that it does not break on offline databases, but merely skips them? Evert |
Saturday, September 4, 2010 - 7:00:58 PM - Atiq Ur Rahman Chaudhary | Back To Top (10127) |
Wonderful, I need restore script too to restore all backup databases to new clean instance of SQL Server. The explanation is as below: Question: How to backup SQL Server 2005 user databases in SQL script with all data (.sql) and restore this script of all databases on SQL server 2008 OR How to restore all databases backed up through this script into new clean instance of SQL Server (backed up in SQL Server 2005 standard and restore to SQL Server 2008 web edition). Can someone help me to backup all MS SQL Server 2005 standard user databases into SQL script (single file) and restore all databases with data from single backup script file to SQL server 2008 web edition. Symptom: Upgrade option for SQL Server standard 2005 to SQL SQL Server 2008 web edition is not supported. I've planned to upgrade SQL Server 2005 standard instance to SQL server 2008 web edition that is not supported and I'm thinking to backup all databases on SQL server 2005 standard into single script file (.sql) install new instance of SQL Server 2008 web edition and restore single script file into new instance. Please help me backup all databases into single script file. OR Alternative option is to generate script to restore all databases through your script in new installation of SQL Server 2008 web edition. Help me please. |
Thursday, December 10, 2009 - 5:44:46 PM - nirajan | Back To Top (4548) |
AWESOME ! Thank you so much! |
Thursday, December 10, 2009 - 5:08:51 PM - admin | Back To Top (4547) |
Creating a backup using this script which uses the native backup commands is all you need. This will backup the data from the data file and the active part of the log file. So when you need to restore your database you would do something like the following: RESTORE DATABASE [insertDBnameHere] FROM DISK = 'insertPathAndFilenameHere' |
Thursday, December 10, 2009 - 4:54:29 PM - nirajan | Back To Top (4546) |
Very nice and helpful post. Thank you so much. I have a quick question. Do I also need to backup the SQL Data and Log files in order to be able to restore the database? Is backing up the database like shown in this article sufficient to restore a database? |
Tuesday, September 1, 2009 - 9:39:26 PM - manish | Back To Top (3985) |
Thanks Sullivrp for correcting the script.
|
Wednesday, August 19, 2009 - 2:19:47 PM - sullivrp | Back To Top (3921) |
Just in case people are still following this thread, here is Manish's code which has been corrected per Yarick's catch and SQL deprecations: DECLARE @name VARCHAR(50), -- database name@path VARCHAR(256), -- path for backup files @fileName VARCHAR(256), -- filename for backup @fileDate VARCHAR(20) -- used for file name CREATE TABLE [dbo].#tempBackup (name VARCHAR(200), flag BIT)SET @path = 'C:\Backup\'-- Includes the date in the filename -- Includes the date and time in the filename INSERT INTO [dbo].#tempBackup (name, flag)SELECT name, 0 FROM master.dbo.sysdatabases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')WHILE EXISTS(SELECT TOP 1 name FROM [dbo].#tempBackup WHERE flag = 0) BEGIN SELECT @name = name, @fileName = @path + name + '_' + @fileDate + '.BAK' -- Unique FileName --@fileName = @path + @name + '.BAK' -- Non-Unique Filename FROM [dbo].#tempBackup WHERE flag = 0 -- does not overwrite the existing file BACKUP DATABASE @name TO DISK = @fileName -- overwrites the existing file (Note: remove @fileDate from the fileName so they are no longer unique --BACKUP DATABASE @name TO DISK = @fileName WITH INITUPDATE #tempBackup SET flag = 1 WHERE name = @name AND flag = 0 END DROP TABLE [dbo].#tempBackupHere is an alternative method using an indentity field on the temp table to prevent unnecessary select / update statements in the while loop!DECLARE @name VARCHAR(50), -- database name@path VARCHAR(256), -- path for backup files @fileName VARCHAR(256), -- filename for backup @fileDate VARCHAR(20), -- used for file name @backupCount INT CREATE TABLE [dbo].#tempBackup (intID INT IDENTITY (1, 1), name VARCHAR(200))SET @path = 'C:\Backup\'-- Includes the date in the filename -- Includes the date and time in the filename INSERT INTO [dbo].#tempBackup (name)SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')SELECT TOP 1 @backupCount = intID FROM [dbo].#tempBackup ORDER BY intID DESC IF ((@backupCount IS NOT NULL) AND (@backupCount > 0))BEGIN DECLARE @currentBackup INTSET @currentBackup = 1 WHILE (@currentBackup <= @backupCount) BEGIN SELECT @name = name, @fileName = @path + name + '_' + @fileDate + '.BAK' -- Unique FileName --@fileName = @path + @name + '.BAK' -- Non-Unique Filename FROM [dbo].#tempBackup WHERE intID = @currentBackup-- does not overwrite the existing file BACKUP DATABASE @name TO DISK = @fileName -- overwrites the existing file (Note: remove @fileDate from the fileName so they are no longer unique --BACKUP DATABASE @name TO DISK = @fileName WITH INITSET @currentBackup = @currentBackup + 1 END END DROP TABLE [dbo].#tempBackup |
Thursday, May 28, 2009 - 11:16:53 PM - manish | Back To Top (3475) |
Hi mon69 I don't know about the tools or any thing to restore the database, how ever I used to restore the same using the batch file. Copy the following script in notepad and save as C:\Restore.bat. and simply on click your databse will be restored. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- osql -e -S DEV1\SQLEXPRESS -U SA -P manish -Q "RESTORE DATABASE MYDB_May29 FROM DISK = 'C:\Temp\MYDB_May29.bak' WITH REPLACE, MOVE 'MYDB' TO 'C:\Database\May29MYDB.mdf', MOVE 'MYDB_log' TO 'C:\Database\May29MYDB.ldf' -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Please Note : the following information need to modify * DEV1\SQLEXPRESS is the name of the server name * SA is the user name * manish is the password ----------------------------------------- Let me know if u face any issues
|
Thursday, May 28, 2009 - 2:58:02 PM - mon69 | Back To Top (3470) |
hi i have tried this script that backs up all databases and i would say that that is really helpful. i have no problem backing up the databases. what i would like to know is how do i reinstate the .bak files into the sql server? what tool should i use if i have no access to the sql server enterprise manager? |
Thursday, March 26, 2009 - 5:46:30 AM - yarick123 | Back To Top (3080) |
Manish, thanks a lot for the Idea to avoid cursors - I could not understand before, why not the all databases were backed up. Small improvement: ms does not recommend to use "SET ROWCOUNT ..." effect with "UPDATE" statement as the this behavior will be possibly changed in next versions of mssql. So, I offer to replace Update #tempbackup set flag=1 WHERE flag=0 with Update #tempbackup set flag=1 WHERE flag=0 AND name=@name
Regards, |
Monday, February 16, 2009 - 5:38:34 AM - saariko | Back To Top (2774) |
Thank you for this script.
Does anyone knows how I can make this more admin friendly? I want to have my daily night backup script call this. Is there a way I can integrate zip into this? Can I have thie proc call part of another script?
thanks |
Friday, February 13, 2009 - 5:12:28 AM - PilotRiaz | Back To Top (2763) |
Ah BCP i will have a go at this one and thanks for the link for a free tool i could also use. Much appreciated. Thanks ;) |
Thursday, February 12, 2009 - 8:33:06 AM - admin | Back To Top (2758) |
No matter what you do you will need at least one full backup, so there are not a lot of options. You could look at using this free tool from Idera that does compressed backups. This could compress the backup up to 90%. http://www.idera.com/Content/Show68.aspx?CartID=5290 Another option is to use BCP to export the raw data table by table. |
Thursday, February 12, 2009 - 7:42:22 AM - PilotRiaz | Back To Top (2757) |
Our database is 22553.56 MB I would like to backup a small amount of this, i am not interested in having all the data backed up as space is an issue on our disk. Could this be chopped in say half? maybe i should read into archiving and do it this way. |
Thursday, February 12, 2009 - 7:25:15 AM - admin | Back To Top (2756) |
If the database is setup using multiple Files you can do file-level backups instead of a full backup. If you have enough space on other drives you can split the backup into multiple files. See this tip: https://www.mssqltips.com/sqlservertip/935/backup-to-multiple-files-for-faster-and-smaller-sql-server-files/ You can also do a backup to a network drive. See this tip: https://www.mssqltips.com/sqlservertip/1126/sql-server-backup-and-restore-to-network-drive/ |
Thursday, February 12, 2009 - 7:17:11 AM - aprato | Back To Top (2755) |
It sounds like to what you're referring to is archiving data. Backing up a database just makes a copy of the data. If you're experiencing data bloat, then you should look into archiving old data. |
Thursday, February 12, 2009 - 5:58:49 AM - manish | Back To Top (2754) |
Riaz, How can we justify the half, as you said you want "to backup half of the database instead of the whole DB".
|
Thursday, February 12, 2009 - 4:09:07 AM - PilotRiaz | Back To Top (2753) |
Yours scipts are superb, very helpful - Thanks. I was wondering can the script be modified to backup half of the database instead of the whole DB? I have a large database and i want to backup half of it because of space isues on our hard disks. Regards, Riaz |
Wednesday, December 24, 2008 - 9:56:19 PM - manish | Back To Top (2443) |
As I learned some where that cursors are not to be used so just updated the main article without cursors.
DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName NVARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name SET @path = 'd:\Backup\' SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) SELECT name,flag=0 into #tempbackup FROM master.dbo.sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb') set rowcount 1 WHILE (exists(SELECT * FROM #tempbackup WHERE flag=0)) BEGIN Select @name=name from #tempbackup WHERE flag=0 SET @fileName = @path + @name + '_' + @fileDate + '.BAK' BACKUP DATABASE @name TO DISK = @fileName Update #tempbackup set flag=1 WHERE flag=0 END set rowcount 0 drop table #tempbackup Thanks Manish
|
Thursday, November 20, 2008 - 10:13:04 AM - aprato | Back To Top (2239) |
Greg's script modified for a db that is backed up to a single file name with its contents overwritten would look something like this DECLARE @name VARCHAR(50) -- database name |
Thursday, November 20, 2008 - 10:08:38 AM - aprato | Back To Top (2238) |
I think all you need to do is eliminate the filedate piece i.e. from SET @fileName = @path + @name + '_' + @fileDate + '.BAK' to SET @fileName = @path + @name + '.BAK'
|
Thursday, November 20, 2008 - 6:54:43 AM - beckytest | Back To Top (2234) |
Great script but not sure how to get around the date variable as this creates a new database each time. With INIT as the command to overwrite the database, doesn't help if the database has a different name each time.
Not a sql DBA obviously and if you were to change the following to a static name what syntax would you use? thanks SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) SET @fileName = @path + @name + '_' + @fileDate + '.BAK' |
Tuesday, November 4, 2008 - 7:43:54 AM - aprato | Back To Top (2139) |
If you want to overwrite the backup file, add a WITH INIT to the end of the BACKUP command. This will overwrite as opposed to appending. |
Tuesday, November 4, 2008 - 5:49:32 AM - JohanA | Back To Top (2135) |
Hi, Thanks for this script. Is there anyway to get this to overwrite the files? I want to dump every day without date in the filename to put them on tape and not get a bunch of files stacked on the server. But when the job runs the next day it appends on the previous files and they get double in size. |
Friday, October 10, 2008 - 2:26:41 PM - grobido | Back To Top (1954) |
Here is an update to the script to also include the time in the filename. DECLARE @name VARCHAR(50) -- database nameDECLARE @path VARCHAR(256) -- path for backup files DECLARE @fileName VARCHAR(256) -- filename for backup DECLARE @fileDate VARCHAR(20) -- used for file name SET @path = 'C:\' SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) + '_' + REPLACE(CONVERT(VARCHAR(20),GETDATE(),108),':','')DECLARE db_cursor CURSOR FORSELECT nameFROM master.dbo.sysdatabases WHERE name IN ('test5') OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGINSET @fileName = @path + @name + '_' + @fileDate + '.BAK' END CLOSE db_cursorDEALLOCATE db_cursor |
Wednesday, August 13, 2008 - 2:05:01 AM - [email protected] | Back To Top (1628) |
After many hundreds of years of searching the net and speaking to SQL X Spurts, a last a backup that I can understand Thanks so much |
Wednesday, July 9, 2008 - 3:17:51 PM - manojsriram | Back To Top (1383) |
Good Script man, it was very helpfull to me, and i hope it will be very much helpfull to others tooo.... Thanks a lot. I needed the file name also in the same naming convention, it was really helpful to me . Thnak you so much. :) |