MS SQL Server
Backup de MS SQL Server
Backups de MS SQLSERVER
Vamos a ver un script sencillo que nos va a permitir realizar backups de SQL Server de Microsoft aunque tengamos la versión Express
El script es bastante sencillo, y debemos de arrancar el Windows Powershell ISE con permisos de Administrador
Una vez arrancado, creamos un archivo nuevo
Escribimos la siguiente sentencia:
Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database " BASE_DE_DATOS_A_COPIAR" -BackupFile" C:\CARPETA_DE_COPIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyy-MM-dd).BAK"
Debes de sustituir los textos (NOMBRE_DEL_SERVIDOR, INSTANCIA_MS_SQL,BASE_DE_DATOS_A_COPIAR, C:\CARPETA_DE_COPIAS) por los datos correspondientes a la instalación. SI tenemos que crear copias de varias bases de datos, generaremos una línea por cada Base de Datos a respaldar
Borrar copias anteriores
Ahora si no tenemos cuidado, llenaremos el disco de copias, para ello es conveniente borrar las copias anteriores a una fecha.
En el mismo script (O en otro nuevo), escribimos lo siguiente:
Get-ChildItem –Path "c:\CARPETA_DE_COPIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item
Esta línea, nos permite borrar los archivos anteriores a los últimos 31 días. (Get-Date).AddDays(-31))
Copia completa con anclajes mensuales
A continuación vamos a realizar un ejemplo completo con copias diarias y guardaremos una copia mensual durante un año.
Crearemos dos scripts, uno para las copias mensuales y otro para las copias diarias
Script para las copias diarias
Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\DIARIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMMdd).BAK"
Como puedes ver, hemos quitado los guiones de la fecha, puedes usar la versión con o sin guiones ((get-date -f yyyyMMdd).BAK o (get-date -f yyyy-MM-dd).BAK)
Ahora el script de las copias mensuales
Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\MENSUALES\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMM).BAK"
Ahora ejecutaremos el script que gestiona el borrado de las copias antiguas
Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\DIARIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\MENSUALES" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-366))} | Remove-Item
Script completo
El script se puede ver a continuación
Diario
Backup-SqlDatabase -ServerInstance "NOMBRE_DEL_SERVIDOR\INSTANCIA_MS_SQL" -Database "BASE_DE_DATOS_A_COPIAR" -BackupFile "C:\CARPETA_DE_COPIAS\DIARIAS\BASE_DE_DATOS_A_COPIAR_$(get-date -f yyyyMMdd).BAK" Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\DIARIAS" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-31))} | Remove-Item Get-ChildItem –Path "c:\CARPETA_DE_COPIAS\MENSUALES" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-366))} | Remove-Item
Planificador de tareas
Ahora, deberemos de crear una tarea, que ejecute la copia diaria y la limpieza, todos los días, y una tarea que se ejecutará mensualmente, que realiza la copia mensual de las Bases de Datos
Pendiente:
Veremos la posibilidad de ponerlo todo en un script que ejecute la copia diaria, y si es el último día de mes, o el primer día de mes (Dependiendo de la hora), ejecute la copia mensual.
Buscar texto en una BBDD de MS SQLSERVER
Para buscar un texto en una BBDD de MS SQLSERVER, crearemos un procedimiento almacenado que contenga
CREATE PROC BuscaValorEnBBDD
(
@StrValorBusqueda nvarchar(100)
)
AS
BEGIN
CREATE TABLE #Resultado (NombreColumna nvarchar(370), ValorColumna nvarchar(3630))
SET NOCOUNT ON
DECLARE @NombreTabla nvarchar(256),
@NombreColumna nvarchar(128),
@StrValorBusqueda2 nvarchar(110)
SET @NombreTabla = ''
SET @StrValorBusqueda2 = QUOTENAME('%' + @StrValorBusqueda + '%','''')
WHILE @NombreTabla IS NOT NULL
BEGIN
SET @NombreColumna = ''
SET @NombreTabla =
(SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @NombreTabla
AND OBJECTPROPERTY(
OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0)
WHILE (@NombreTabla IS NOT NULL) AND (@NombreColumna IS NOT NULL)
BEGIN
SET @NombreColumna =
(SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@NombreTabla, 2)
AND TABLE_NAME = PARSENAME(@NombreTabla, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @NombreColumna)
IF @NombreColumna IS NOT NULL
BEGIN
INSERT INTO #Resultado
EXEC
('SELECT ''' + @NombreTabla + '.' + @NombreColumna + ''', LEFT(' + @NombreColumna + ', 3630)
FROM ' + @NombreTabla + ' (NOLOCK) ' + ' WHERE ' + @NombreColumna + ' LIKE ' + @StrValorBusqueda2)
END
END
END
SELECT NombreColumna, ValorColumna FROM #Resultado
END
Para buscar, sólo tendremos que ejecutar en el servidor MSSQL
EXEC dbo.BuscaValorEnBBDD 'texto_a-buscar'