sql >> Databasteknik >  >> RDS >> Database

Hur man automatiserar SQL-databasunderhållsuppgifter med SQLCMD

Den här artikeln handlar om att automatisera SQL-databasunderhållsuppgifter genom verktyget SQLCMD som låter dig köra T-SQL-kommandon direkt från kommandotolken utan att använda SSMS (SQL Server Management Studio).

Vanligtvis kräver automatisering av databasuppgifter SSMS (SQL Server Management Studio) för att schemalägga jobb som kör dessa uppgifter, men i den här artikeln används ett alternativt tillvägagångssätt för att automatisera databasuppgifter utan att behöva använda det välbehövliga SSMS.

SQLCMD-verktyget kan spara i realtid för databasutvecklare och DBA:er eftersom de omedelbart kan köra de nödvändiga SQL-skripten från kommandoraden, och automatisering av databasunderhållsuppgifter med SQLCMD-verktyget är ett plus.

Grunderna för att automatisera SQL-databasuppgifter

Låt oss gå igenom några grundläggande koncept för att automatisera SQL-databasunderhållsuppgifter med verktyget SQLCMD.

Vad är en databasunderhållsuppgift?

En databasunderhållsuppgift, som namnet anger, är en uppgift som hjälper till att hantera eller underhålla en databas för att säkerställa att den fungerar smidigt.

Att skapa databassäkerhetskopior på daglig basis är till exempel en databasunderhållsuppgift som säkerställer att databasen säkerhetskopieras, så att i händelse av en incident, som antingen skadar databasen eller gör den instabil, kan den återställas framgångsrikt utan att förlora alla data.

Vem utför databasunderhållsuppgifter?

Vanligtvis utför yrkesmän som ansvarar för databassystemunderhåll, såsom databasadministratörer, databasunderhållsuppgifter, men detta kan ändras under vissa omständigheter.

Hur görs en databasunderhållsuppgift?

En databasunderhållsuppgift utförs normalt manuellt av en databasadministratör då och då, eller så kan den också schemaläggas att köras automatiskt.

Vad innebär automatisering av en databasunderhållsuppgift?

Att automatisera en databasunderhållsuppgift innebär att schemalägga en databasunderhållsuppgift så att den körs automatiskt utan några manuella ingrepp.

Vilka är fördelarna med att automatisera databasunderhållsuppgifter?

Att automatisera databasunderhållsuppgifter sparar tid och ansträngning, hjälper till att standardisera processen och gör det lättare att utföra den på regelbunden basis, och snabba varningar konfigurerade för ett automatiserat jobbfel kan också påskynda processen att identifiera orsaken till ett problem om uppgiften misslyckas.

Hur kan du automatisera databasunderhållsuppgiften?

En av de avancerade användningarna av SQLCMD-verktyget är automatisering av databasunderhållsuppgifter. Vi kommer att automatisera databasunderhållsuppgifter utan att använda SSMS (SQL Server Management Studio) i den här artikeln.

Windows Task Scheduler

Vi kommer att dra fördel av Windows Task Scheduler för att automatisera databasunderhållsuppgifter som inte kräver SSMS (SQL Server Management Studio).

Förutsättningar

Den här artikeln förutsätter att du har grundläggande kunskaper om databasunderhållsuppgifter som utförs genom att köra T-SQL-satser tillsammans med en grundläggande förståelse för verktyget SQLCMD.

Se artikeln Grunderna i att köra T-SQL-satser från kommandoraden med SQLCMD för att få en gedigen förståelse för grunderna i SQLCMD innan du går vidare till avancerad användning.

Se även artikeln Running SQL Database Maintenance Tasks Using SQLCMD för att lära dig hur du utför SQL-databasunderhållsuppgifter.

Den här artikeln förutsätter också att ett exempel på universitetsdatabas har skapats.

Läs en annan artikel Grunderna för att köra T-SQL-satser från kommandoraden med SQLCMD för att skapa en exempeldatabas eller använd följande T-SQL-kod för att ställa in exempeldatabasen som heter University:

-- (1) Create University sample database
CREATE DATABASE University;
GO

USE University

-- (2) Create Course table
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Course') 
DROP TABLE dbo.Course 

CREATE TABLE [dbo].[Course] (
    [CourseId] INT           IDENTITY (1, 1) NOT NULL,
    [Name]     VARCHAR (30)  NOT NULL,
    [Detail]   VARCHAR (200) NULL,
    CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC)
);

-- (3) Create Student table
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Student') 
DROP TABLE dbo.Student 

CREATE TABLE [dbo].[Student] (
    [StudentId] INT           IDENTITY (1, 1) NOT NULL,
    [Name]      VARCHAR (30)  NULL,
    [Course]    VARCHAR (30)  NULL,
    [Marks]     INT           NULL,
    [ExamDate]  DATETIME2 (7) NULL,
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC)
);

-- (4) Populate Course table
SET IDENTITY_INSERT [dbo].[Course] ON
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (1, N'DevOps for Databases', N'This is about DevOps for Databases')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Power BI Fundamentals', N'This is about Power BI Fundamentals')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (3, N'T-SQL Programming', N'About T-SQL Programming')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (4, N'Tabular Data Modeling', N'This is about Tabular Data Modeling')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')
SET IDENTITY_INSERT [dbo].[Course] OFF

-- (5) Populate Student table
SET IDENTITY_INSERT [dbo].[Student] ON
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (1, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00')
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00')
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (3, N'Sam', N'Database Management System', 85, N'2016-01-01 00:00:00')
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (4, N'Adil', N'Database Management System', 85, N'2016-01-01 00:00:00')
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (5, N'Naveed', N'Database Management System', 90, N'2016-01-01 00:00:00')
SET IDENTITY_INSERT [dbo].[Student] OFF
GO

Automatisera uppgiften att säkerhetskopiera universitetsdatabasen

Låt oss ta en titt på scenariot där säkerhetskopiering av databas måste automatiseras.

Krav:Automatisera säkerhetskopieringen av universitetsdatabasen

En DBA ombads att automatisera säkerhetskopiering av databas som visar datum och tid för säkerhetskopieringen för att spara tid och undvika förvirring över den senaste säkerhetskopieringen och påskynda den övergripande processen.

För att uppfylla dessa affärskrav måste ett SQLCMD-skript som skapar databassäkerhetskopiering köras i Windows Task Scheduler.

Skapa mappar för databassäkerhetskopiering och skript

Skapa först en mapp med namnet Demo på enhet C och skapa sedan följande undermappar i Demon mapp:

  1. Säkerhetskopiering
  2. Skript

Observera att vi endast använder enhet C för demoändamål, använd en backupdisk i realtidsscenario.

Skapa SQL Databas Backup Script

Skapa säkerhetskopieringsskript för SQL-databas och spara det som 01-Backup-University-sql-script.sql i C:\Demo\Scripts som också innehåller information om säkerhetskopieringsdatum och tid enligt följande:

-- Creating University database backup with date and time 
DECLARE @Backup NVARCHAR(400)
SET @Backup=CONCAT('C:\Demo\Backups\University-',(FORMAT(GETDATE(),'yyyy-MM-dd-hh-mm-ss-tt')),'.bak')
BACKUP DATABASE [University] TO  DISK = @Backup
WITH NOFORMAT, NOINIT,  NAME = N'University-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Spara SQL-skript i skriptmappen

Spara SQL-backupskriptet i C:\Demo\Scripts mapp.

Skapa SQLCMD Backup Script

Databassäkerhetskopieringsskriptet som refererar till SQL-skriptet som använder SQLCMD skapas enligt följande:

Sqlcmd –S . –i c:\Demo\Scripts\01-Bakup-University-sql-script.sql

Där "." (prick) är den förvalda namnlösa SQL-instansen här som kan ersättas av en namngiven SQL-instans som .\.

Testa köra SQLCMD Backup Script

Kör ovanstående SQLCMD-skript från kommandoraden för att testa säkerhetskopieringsskriptet:

Skriptet kördes framgångsrikt, så vi är igång.

Gå till Säkerhetskopiering mapp och radera säkerhetskopian som skapas som ett resultat av testkörningen.

Skapa en batchfil för att referera till SQLCMD-skriptet

Skapa en batchfil med namnet 02-Run-Sqlcmd-Backup-script.bat använda Notepad och spara det som .bat:

@Echo off
sqlcmd -E -S . -i c:\Demo\Scripts\01-Bakup-University-sql-script.sql

Observera att det finns en liten förändring i SQLCMD-skriptet :-E läggs till , vilket faktiskt är standardautentiseringsalternativet och behöver inte specificeras enligt Microsofts dokumentation.

Detta illustreras enligt följande:

Schemalägg databassäkerhetskopieringsuppgift i Windows Task Scheduler

Öppna Windows Task Scheduler genom att skriva Task Scheduler i Windows-sökningen och klicka sedan på Task Scheduler :

När Windows Task Scheduler har öppnats klickar du på Skapa grundläggande uppgift... från alternativen till höger och skriv Backup University Database Task i Namn inmatningsrutan och klicka på Nästa :

Ställ sedan in frekvensen för uppgiften genom att lämna standardinställningarna, som är dagligen:

Ställ in den dagliga tiden då denna uppgift ska aktiveras (det rekommenderas att ställa in tiden från två till tre minuter plus din nuvarande tid för att omedelbart kontrollera att den fungerar):

Vi måste också välja Starta ett program på frågan vad vill vi att den här uppgiften ska utföra:

Peka sedan på batchfilen som anropar SQLCMD för att skapa en säkerhetskopia av universitetsdatabasen och klicka på Nästa :

Klicka på Slutför för att slutföra processen.

Det är möjligt att du lagt ner mer tid på det som ställts in i jobbschemat för att slutföra jobbinställningen, vilket innebär att du måste vänta till nästa dag för att se om uppgiften körs eller inte.

Det finns en lösning - du måste schemalägga uppgiften igen 2-3 minuter före din nuvarande tid för att se den köras om 2-3 minuter istället för att vänta på hela dagen:

Vänta nu tills uppgiften körs automatiskt och efter den angivna tiden, kontrollera säkerhetskopieringsmappen som vi skapade i Demo mapp på enhet C:

Grattis, databasunderhållsuppgiften har framgångsrikt automatiserats med hjälp av Windows Task Scheduler, som anropar en batchfil som kör SQLCMD-skriptet för att skapa en säkerhetskopia.

Vänligen radera den automatiska uppgiften som skapades för demoändamål när du är klar med genomgången och inte är intresserad av att köra den vidare.

Saker att göra

Nu när du är redo att automatisera databasunderhållsuppgifter, som att säkerhetskopiera en databas med verktyget SQLCMD och Windows Task Scheduler efter att ha gått igenom den här artikeln, kan du förbättra dina färdigheter ytterligare genom att prova följande saker:

  1. Försök att ställa in och automatisera säkerhetskopieringen av en exempeldatabas SQLBookShop som nämns i artikeln Att förenkla enhetstestning av huvudlagrad procedur som också kallar en verktygsprocedur.
  2. Försök att skapa flera databaser och automatisera deras säkerhetskopior med hjälp av verktyget SQLCMD med Windows Task Scheduler.
  3. Försök att automatisera processerna för säkerhetskopiering och återställning av databas genom att skapa två batchfiler, en för säkerhetskopiering och den andra för att återställa databasen med hänvisning till SQLCMD-skript och schemalägga jobbet i Windows Task Scheduler för att köras dagligen.

Användbart verktyg:

dbForge Studio för SQL Server – kraftfull IDE för SQL Server-hantering, administration, utveckling, datarapportering och analys.


  1. Vilka färdigheter och kunskaper behöver databasdesigners?

  2. Är det möjligt att ange schemat när man ansluter till postgres med JDBC?

  3. SQL-fråga för att komprimera dubbletter av värden efter datumintervall

  4. MySQL Alter lagrad procedur