Basic rsyncing:
#!/bin/bash
rsync -avz --delete --exclude= --exclude=remotehost.com:/the/remote/directory/ /the/local/dir
Basic rsyncing:
#!/bin/bash
rsync -avz --delete --exclude= --exclude=remotehost.com:/the/remote/directory/ /the/local/dir
DECLARE @db_name VARCHAR(100)
SELECT @db_name = 'mydb'
-- Get Backup History
SELECT TOP (30) s.database_name, s.name, s.description
,m.physical_device_name
,CAST(CAST(s.backup_size / 1000000 AS INT) AS VARCHAR(14)) + ' ' + 'MB' AS bkSize
,CAST(DATEDIFF(second, s.backup_start_date, s.backup_finish_date) AS VARCHAR(4)) + ' ' + 'Seconds' TimeTaken
,s.backup_start_date
,CAST(s.first_lsn AS VARCHAR(50)) AS first_lsn
,CAST(s.last_lsn AS VARCHAR(50)) AS last_lsn
,CASE s.[type] WHEN 'D'
THEN 'Full'
WHEN 'I'
THEN 'Differential'
WHEN 'L'
THEN 'Transaction Log'
END AS BackupType
,s.server_name
,s.recovery_model
FROM msdb.dbo.backupset s
INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id
WHERE s.database_name = @db_name
ORDER BY backup_start_date DESC
,backup_finish_date
Run the below on the Primary
BACKUP DATABASE LogRestoreDB
TO DISK = '\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_full1.bak'
WITH INIT, FORMAT,COMPRESSION
INSERT INTO t1(Id)
VALUES (1)
BACKUP LOG LogRestoreDB
TO DISK = '\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log1.trn'
WITH INIT, COMPRESSION
INSERT INTO t1(Id)
VALUES (2)
BACKUP DATABASE LogRestoreDB
TO DISK = '\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log2.trn'
WITH INIT, COMPRESSION
INSERT INTO t1(Id)
VALUES (3)
BACKUP DATABASE LogRestoreDB
TO DISK = '\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log3.trn'
WITH INIT, COMPRESSION
Run the below on the Secondary to restore the database in standby/read-only mode
ALTER DATABASE LogRestoreDB
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master];
RESTORE DATABASE [LogRestoreDB]
FROM DISK = N'\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_Full.bak'
WITH STANDBY = '\\SQLSERVER01\SQLBackup\Standby\LogRestoreDB_Standby.tuf';
GO
--Check the table t1
-- SELECT * from t1;
USE [master];
RESTORE DATABASE [LogRestoreDB]
FROM DISK = N'\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log1.trn'
WITH STANDBY = '\\SQLSERVER01\SQLBackup\Standby\LogRestoreDB_Standby.tuf';
GO
--Check the table t1
-- SELECT * from t1;
USE [master];
RESTORE DATABASE [LogRestoreDB]
FROM DISK = N'\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log2.trn'
WITH STANDBY = '\\SQLSERVER01\SQLBackup\Standby\LogRestoreDB_Standby.tuf';
GO
--Check the table t1
-- SELECT * from t1;
USE [master];
RESTORE DATABASE [LogRestoreDB]
FROM DISK = N'\\SQLSERVER01\SQLBackup\Temp\LogRestoreDB_log3.trn'
WITH STANDBY = '\\SQLSERVER01\SQLBackup\Standby\LogRestoreDB_Standby.tuf';
GO
--Check the table t1
-- SELECT * from t1;
Docker pull: Download an image from the docker repository
Docker run: Create a container from the image
Docker start: Start a container that has been stopped
Docker stop: Stop a container that is running
Docker help: Show help for Docker commands
Docker Commands to Manage Containers
Docker ps: Show running containers
Docker ps -a: Show all container
Docker rm: Remove stopped container
Docker Exec: Execute a command in a running container
Docker cp: Copy files to and from a container
Docker Commands to Manage Images
Docker images: Show and work with images
Docker rmi: Remove image
Docker commit: Create an image from a container
Docker Commands to do things
docker run -p 1433:1433 -e SA_PASSWORD=passw0rd -e ACCEPT_EULA=Y mcr.microsoft.com/mssql/server:2019-latest
docker exec -it sql_preprod mkdir /var/opt/mssql/backup
docker cp c:\temp\db1.bak sql_preprod:/var/opt/mssql/backup
docker exec -it sql_preprod /bin/bash
This post is a condensed version of the original post by Andreas Jordan. Prerequisites were taken from sqlservercentral. They have compiled a nice and extensive list of them.
With SQL Server 2012, Microsoft introduced the AlwaysOn Availability Group feature, and since then many changes and improvements have been made. This article will cover the prerequisites and steps to install AlwaysOn in a SQL 2019 environment.
Prerequisites
Windows
SQL Server
Network
Databases in the AG
Step 1: Add Windows Failover Cluster to each server
Define the variables
#Define the variables for SQLCluster
$DomainName = 'DOMAIN'
$DomainController = 'DC1.com'
$Networkshare = 'FS01.com'
$ClusterNodes = 'SQLSERVER01.com', 'SQLSERVER02.com','SQLSERVER03.com'
$ClusterName = 'SQLSERVERCL01'
$ClusterIP = '10.0.0.28'
Below code will install the failover cluster feature on all the nodes (servers/replicas whatever you want to call them)
#Install Failover cluster on all the nodes
Invoke-Command -ComputerName $ClusterNodes -ScriptBlock { Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools } | Format-Table
Move the servers to a fixed OU in Active directory (I have had to create an OU named SQL Always ON for this purpose)
Move-ADObject -Identity 'CN=SQLSERVER01,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
Move-ADObject -Identity 'CN=SQLSERVER02,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
Move-ADObject -Identity 'CN=SQLSERVER03,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
Next up is create the windows cluster, which is the basis for SQL AlwaysOn
#We do not have shared storage for the quorum in the environment
#Therefore, we will create the network share on the domain controller and authorize the computer account of the failover cluster we just created
Invoke-Command -ComputerName $DomainController -ScriptBlock {
New-Item -Path "C:\WindowsClusterQuorum_$using:ClusterName" -ItemType Directory | Out-Null
New-SmbShare -Path "C:\WindowsClusterQuorum_$using:ClusterName" -Name "WindowsClusterQuorum_$using:ClusterName" | Out-Null
Grant-SmbShareAccess -Name "WindowsClusterQuorum_$using:ClusterName" -AccountName "$using:DomainName\$using:ClusterName$" -AccessRight Full -Force | Out-Null
}
$Cluster | Set-ClusterQuorum -NodeAndFileShareMajority "\\$DomainController\WindowsClusterQuorum_$ClusterName" | Format-List
If you have reached this point, then you have completed the windows server level prerequisites.
Next step is to create the availability group. Before, we do that, we need to enable the AlwaysOn on SQL instances using the below code. Don’t you love not having to RDP into a machine and do all this manually!
#Define the variable for AlwaysOn group
$SQLServerServiceAccount = 'svc-sql-serviceaccount'
$Password = 'SecurePassword'
$BackupPath = '\FS01.com.local\SQLBackup\Temp'
$DatabaseName = 'DB01'
$AvailabilityGroupName = 'SQLAG01'
$AvailabilityGroupIP = '10.0.0.19'
#Enable Always On on SQL instances, typically done via SQL Server Configuration Manager
Enable-DbaAgHadr -SqlInstance $SqlInstances -Force | Format-Table
Next, setup the endpoints
#Setup of the endpoints
New-DbaEndpoint -SqlInstance $SqlInstances -Name hadr_endpoint -Port 5022 | Start-DbaEndpoint | Format-Table
New-DbaLogin -SqlInstance $SqlInstances -Login "$DomainName\$SQLServerServiceAccount" | Format-Table
Invoke-DbaQuery -SqlInstance $SqlInstances -Query "GRANT CONNECT ON ENDPOINT::hadr_endpoint TO [$DomainName\$SQLServerServiceAccount]"
Finally, we need to backup the database on primary and restore them onto each replica with norecovery in order to be able to join them to an availability group.
#Transfer databases to replica
$Database = Get-DbaDatabase -SqlInstance $SqlInstances[0] -Database $DatabaseName
$Database | Backup-DbaDatabase -Path $BackupPath -Type Database | Restore-DbaDatabase -SqlInstance $SqlInstances[1] -NoRecovery | Out-Null
$Database | Backup-DbaDatabase -Path $BackupPath -Type Log | Restore-DbaDatabase -SqlInstance $SqlInstances[1] -Continue -NoRecovery | Out-Null
Finally, create the availability group and resume the data movement
#Create the availability group
$AvailabilityGroup = New-DbaAvailabilityGroup `
-Name $AvailabilityGroupName `
-Database $DatabaseName `
-ClusterType Wsfc `
-Primary $SqlInstances[0] `
-Secondary $SqlInstances[1] `
-SeedingMode Automatic `
-IPAddress $AvailabilityGroupIP `
-Confirm:$false
$AvailabilityGroup | Format-List
Get-DbaAgReplica -SqlInstance $SqlInstances[0] -AvailabilityGroup $AvailabilityGroupName | Format-Table
Get-DbaAgDatabase -SqlInstance $SqlInstances -AvailabilityGroup $AvailabilityGroupName -Database $DatabaseName | Format-Table
Here is the complete code in one piece for your ease of copying it for implementation on your own environment. You will have to replicate the last piece of code in order to other databases. I have yet to experiment if I can pass multiple databases as parameters to backup-dbadatabase and join them to the AG.
#Define the variables for Windows SQLCluster
$DomainName = 'DOMAIN'
$DomainController = 'DC1.com'
$Networkshare = 'FS01.com'
$ClusterNodes = 'SQLSERVER01.com', 'SQLSERVER02.com','SQLSERVER03.com'
$ClusterName = 'SQLSERVERCL01'
$ClusterIP = '10.0.0.28'
#Install Failover cluster on all the nodes
Invoke-Command -ComputerName $ClusterNodes -ScriptBlock { Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools } | Format-Table
#Move the servers to a fixed OU in Active directory
Move-ADObject -Identity 'CN=SQLSERVER01,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
Move-ADObject -Identity 'CN=SQLSERVER02,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
Move-ADObject -Identity 'CN=SQLSERVER03,CN=Computers,DC=com,DC=local' -TargetPath 'OU=SQL Always ON,OU=Servers,DC=com,DC=local'
#We do not have shared storage for the quorum in the environment
#Therefore, we will create the network share on the domain controller and authorize the computer account of the failover cluster we just created
Invoke-Command -ComputerName $DomainController -ScriptBlock {
New-Item -Path "C:\WindowsClusterQuorum_$using:ClusterName" -ItemType Directory | Out-Null
New-SmbShare -Path "C:\WindowsClusterQuorum_$using:ClusterName" -Name "WindowsClusterQuorum_$using:ClusterName" | Out-Null
Grant-SmbShareAccess -Name "WindowsClusterQuorum_$using:ClusterName" -AccountName "$using:DomainName\$using:ClusterName$" -AccessRight Full -Force | Out-Null
}
$Cluster | Set-ClusterQuorum -NodeAndFileShareMajority "\\$DomainController\WindowsClusterQuorum_$ClusterName" | Format-List
#Define the variable for AlwaysOn group
$SQLServerServiceAccount = 'svc-sql-serviceaccount'
$Password = 'SecurePassword'
$BackupPath = '\FS01.com.local\Temp'
$DatabaseName = 'DB01'
$AvailabilityGroupName = 'SQLAG01'
$AvailabilityGroupIP = '10.0.0.19'
#Enable Always On on SQL instances, typically done via SQL Server Configuration Manager
Enable-DbaAgHadr -SqlInstance $SqlInstances -Force | Format-Table
#Setup of the endpoints
New-DbaEndpoint -SqlInstance $SqlInstances -Name hadr_endpoint -Port 5022 | Start-DbaEndpoint | Format-Table
New-DbaLogin -SqlInstance $SqlInstances -Login "$DomainName\$SQLServerServiceAccount" | Format-Table
Invoke-DbaQuery -SqlInstance $SqlInstances -Query "GRANT CONNECT ON ENDPOINT::hadr_endpoint TO [$DomainName\$SQLServerServiceAccount]"
#Transfer databases to replica
$Database = Get-DbaDatabase -SqlInstance $SqlInstances[0] -Database $DatabaseName
$Database | Backup-DbaDatabase -Path $BackupPath -Type Database | Restore-DbaDatabase -SqlInstance $SqlInstances[1] -NoRecovery | Out-Null
$Database | Backup-DbaDatabase -Path $BackupPath -Type Log | Restore-DbaDatabase -SqlInstance $SqlInstances[1] -Continue -NoRecovery | Out-Null
#Create the availability group
$AvailabilityGroup = New-DbaAvailabilityGroup `
-Name $AvailabilityGroupName `
-Database $DatabaseName `
-ClusterType Wsfc `
-Primary $SqlInstances[0] `
-Secondary $SqlInstances[1] `
-SeedingMode Automatic `
-IPAddress $AvailabilityGroupIP `
-Confirm:$false
$AvailabilityGroup | Format-List
Get-DbaAgReplica -SqlInstance $SqlInstances[0] -AvailabilityGroup $AvailabilityGroupName | Format-Table
Get-DbaAgDatabase -SqlInstance $SqlInstances -AvailabilityGroup $AvailabilityGroupName -Database $DatabaseName | Format-Table