Como ya sabrán, no se puede restaurar un back up de SQL 2008 en SQL 2005 ya que no esta soportado el retroceso de versión por la aplicación

Estos son los pasos necesarios para generar los scripts:

  • Usando el asistente de scripts en SQL 2008, generar los mismos de los datos y los esquemas, manteniendo la opción de compatibilidad con SQL 2005.
  • Ejecutar el asistente “Generate SQL Server Scripts” en el SQL Server Management Studio (verificar que el Object Explorer este conectado a la base correcta) haciendo clic sobre el botón derecho del raton sobre la base y seleccionando “Tasks –> Generate Scripts.”
  • Clickear en “Script all objects in selected database” y en “siguiente”
  • Cambiar la opción del script, especialmente, poner “Script for Server Version” en “SQL Server 2005” y “Script Data” en TRUE. Si gustan, SQL Server 2000 también sirve. Si es la primera vez que van a realizar el proceso, no se olviden de poner en TRUE la opción “Script Database Create” antes de darle en “siguiente”
  • Finalizamos el asistente…

Luego, es cuestión de ejecutar el script en el nuevo (o viejo) SQL Server 2005 Management Studio.

Sin mas ni mas ;P

Sin duda el RAR es uno de mis programas favoritos y hoy se los acerco para mostrarles el paramento –TO cuya función es filtrar la selección de archivos a través de la fecha de los mismo.

Desde el cmd, al ejecutar RAR /?, vemos los distintos parámetros de la aplicación:

Usage:     rar  - -  
               <@listfiles...> 

  a             Add files to archive
  c             Add archive comment
  cf            Add files comment
  ch            Change archive parameters
  cw            Write archive comment to file
  d             Delete files from archive
  e             Extract files to current directory
  f             Freshen files in archive
  i[par]=  Find string in archives
  k             Lock archive
  l[t,b]        List archive [technical, bare]
  m[f]          Move to archive [files only]
  p             Print file to stdout
  r             Repair archive
  rc            Reconstruct missing volumes
  rn            Rename archived files
  rr[N]         Add data recovery record
  rv[N]         Create recovery volumes
  s[name|-]     Convert archive to or from SFX
  t             Test archive files
  u             Update files in archive
  v[t,b]        Verbosely list archive [technical,bare]
  x             Extract files with full path

<Switches>
  -             Stop switches scanning
  ac            Clear Archive attribute after compression or extraction
  ad            Append archive name to destination path
  ag[format]    Generate archive name using the current date
  ai            Ignore file attributes
  ao            Add files with Archive attribute set
  ap      Set path inside archive
  as            Synchronize archive contents
  av            Put authenticity verification (registered versions only)
  av-           Disable authenticity verification check
  c-            Disable comments show
  cfg-          Disable read configuration
  cl            Convert names to lower case
  cu            Convert names to upper case
  df            Delete files after archiving
  dh            Open shared files
  dr            Delete files to Recycle Bin
  ds            Disable name sort for solid archive
  dw            Wipe files after archiving
  e[+]    Set file exclude and include attributes
  ed            Do not add empty directories
  en            Do not put 'end of archive' block
  ep            Exclude paths from names
  ep1           Exclude base directory from names
  ep2           Expand paths to full
  ep3           Expand paths to full including the drive letter
  f             Freshen files
  hp[password]  Encrypt both file data and headers
  id[c,d,p,q]   Disable messages
  ieml[addr]    Send archive by email
  ierr          Send all messages to stderr
  ilog[name]    Log errors to file (registered versions only)
  inul          Disable all messages
  ioff          Turn PC off after completing an operation
  isnd          Enable sound
  k             Lock archive
  kb            Keep broken extracted files
  m<0..5>       Set compression level (0-store...3-default...5-maximal)
  mc       Set advanced compression parameters
  md      Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)
  ms[ext;ext]   Specify file types to store
  mt   Set the number of threads
  n       Include only specified file
  n@            Read file names to include from stdin
  n@      Include files listed in specified list file
  o[+|-]        Set the overwrite mode
  oc            Set NTFS Compressed attribute
  or            Rename files automatically
  os            Save NTFS streams
  ow            Save or restore file owner and group
  p[password]   Set password
  p-            Do not query password
  r             Recurse subdirectories
  r-            Disable recursion
  r0            Recurse subdirectories for wildcard names only
  ri[ : ]   Set priority (0-default,1-min..15-max) and sleep time in ms
  rr[N]         Add data recovery record
  rv[N]         Create recovery volumes
  s[,v[-],e] Create solid archive
  s-            Disable solid archiving
  sc[obj]  Specify the character set
  sfx[name]     Create SFX archive
  si[name]      Read data from standard input (stdin)
  sl      Process files with size less than specified
  sm      Process files with size more than specified
  t             Test files after archiving
  ta      Process files modified after  in YYYYMMDDHHMMSS format
  tb      Process files modified before  in YYYYMMDDHHMMSS format
  tk            Keep original archive time
  tl            Set archive time to latest file
  tn      Process files newer than 
  to      Process files older than 
  ts[N]  Save or restore file time (modification, creation, access)
  u             Update files
  v             Create volumes with size autodetection or list all volumes
  v[k,b]  Create volumes with size=*1000 [*1024, *1]
  vd            Erase disk contents before creating volume
  ver[n]        File version control
  vn            Use the old style volume naming scheme
  vp            Pause before each volume
  w       Assign work directory
  x       Exclude specified file
  x@            Read file names to exclude from stdin
  x@      Exclude files listed in specified list file
  y             Assume Yes on all queries
  z[file]       Read archive comment from file 

Pero de todos estos nos quedamos con:

  m[f]          Move to archive [files only]
  ag[format]    Generate archive name using the current date
  dh            Open shared files
  ep1           Exclude base directory from names
  m<0..5>       Set compression level (0-store...3-default...5-maximal)
  r             Recurse subdirectories
  s[,v[-],e] Create solid archive
  to      Process files older than 
  y             Assume Yes on all queriesa

Ahora, los combinamos un poco para ajustarlo a nuestro gusto…

RAR.EXE m -agYYYYMMDDHHMMSS -m5 -r -y -dh -k -ep1 -s -md4096 -to365d
 C:\carpetadedestino\bk.rar "C:\carpetaconarchivos\*.*"

Listo, ya tenemos todos los archivos anteriores a 365 días en el BK.RAR. El único detalle es que el compresor no borra las carpetas… pero nada serio, tenemos la nota anterior que nos muestra cómo hacerlo automáticamente.

Otra cosa para destacar del parámetro –TO es que soporta días, horas, minutos y segundos. El formato para solicitarlo es:

[d][h][m][s]

Por ejemplo se prodria usar: -to15d para afectar a archivos anteriores a 15 dias o bien –to2h30m para hacerlo con archivos anteriores a 2 horas 30 minutos.

En principio, obtenemos un listado de las carpetas con un DIR:

DIR /AD /B /S | SORT /R

Ahora adaptamos el dir para aplicar el clasido RD:

for /f "delims=" %i in ('dir DIR  /AD /B /S ^| sort /r') do rd "%i"

Cabe señalar que NO hay que agregar al RD el /S ni el /Q ya que borraríamos demás.

El SORT /R es la clave del borrado ya que presenta el listado de las carpetas de forma inversa, de esta forma el RD siguiente puede borrar desde adentro hacia afuera las carpetas vacías.

Ahora, lo único que queda por hacer es adaptarlo a un BAT que reciba como parámetro la ruta inicial a partir de la cual se desea borrar:

RDCarpetasVacias.bat

for /f "delims=" %%i in ('DIR %1 /AD /B /S ^| sort /r') do rd "%%i"

Usándolo con: RDCarpetasVacias.bat C:\Temp

Basicamente nos debemos conectar con WMI al equipo remoto (o local) para realizar la tarea.
Luego cambiamos el usuario y la contraseña y reiniciamos el servicio…

Function Set-ServiceAcctCreds([string]$strCompName,[string]$strServiceName,
[string]$newAcct,[string]$newPass)
{
$filter = 'Name=' + "'" + $strServiceName + "'" + ''
$service = Get-WMIObject -ComputerName $strCompName -namespace "root\cimv2" -class 
Win32_Service -Filter $filter
$service.Change($null,$null,$null,$null,$null,$null,$newAcct,$newPass)
$service.StopService()
while ($service.Started){
sleep 2
$service = Get-WMIObject -ComputerName $strCompName -namespace "root\cimv2" -class 
Win32_Service -Filter $filter}
$service.StartService()
}

Para hacer un backup de una base de datos

mysqldump -uUsuario -p dbnombre > dbnombre.sql

Esto creara un fichero dbnombre.sql con toda la imagen de la dbnombre

Podemos comprimir directamente del dumpeado, para ganar espacio utilizando el gzip. Se haria asi:

mysqldump -uUsuario -p dbnombre | gzip > dbnombre.gz

Para recuperar los datos (o importar):

mysql -uUsuario -p dbnombre < dbnombre.sql

…y si al final habiamos decidido zipear el archivo, lo hariamos de esta otra forma:

gunzip < dbnombre.gz | mysql -uUsuario -p dbnombre

Para volcar el contenido de la bbdd con la hora y día:

mysqldump -uUsuario -p dbnombre > backup-`date +%Y%m%d`-dbnombre.sql

La TempDB, en SQL 2005, es recreada cada vez que el SQL Server es reiniciado utilizando una copia de la base Model. Lo cual tiene su lógica y me obliga a cambiar la Model para cambiar la TempDB.

En caso de haberlo intentado hacerlo desde el T-SQL, recibimos este error:

ALTER DATABASE model COLLATE SQL_Latin1_General_CP1_CI_AS;

Cannot alter the database 'model' because it is a system database. (Microsoft SQL Server, Error: 3708)

Esto sucede porque todas las bases del sistema (incluyendo la model y la tempdb) deben tener el mismo collate que la master ;P
Entonces, para cambiar la tempdb, necesitamos cambiar la model… y para cambiar la model necesitamos cambiar la master!!!

En las versiones anteriores de SQL, lo haríamos con REBUILDM.EXE, pero este no funciona en 2005.
En 2005 necesitamos algo… más oscuro… más del tipo de cosas que nos gustan ;p

La receta:

1. Detener el servicio de SQL

2. Reconstruir las bases de datos del sistema:

start /wait setup.exe /qb INSTANCENAME=[INSTANCE_NAME] REINSTALL=SQL_Engine
REBUILDDATABASE=1 SAPWD=[CLAVE-DE-SA] SQLCOLLATION=[NUEVO-COLLATE]

.
Esto se debe hacer desde el CD de instalación y NO desde la carpeta Setup Bootstrap.
También cabe señalar que la contraseña [CLAVE-DE-SA] debe ser de tipo fuerte, es decir, números minúsculas, mayúsculas y símbolos.
El nombre de la instancia se obtiene con:

Select SERVERPROPERTY('InstanceName')

3. Reiniciar los servicios de SQL en modo normar

Y antes que nada pegarle una mirada a:
http://msdn2.microsoft.com/en-us/library/ms179254.aspx !!!

Lo primero que necesitamos saber son los nombres lógicos de los archivos involucrados, con : sp_helpfile

Vemos:
tempdev
templog

Estos son los que se crean por omisión durante la instalación, pero pueden variar. No está de más revisar.

Ahora, simplemente con un ALTER DATABASE, lo hacemos.

use master
go
Alter database tempdb modify file (name = tempdev, filename = 'T:\SQLFiles\tempdb.mdf')
go
Alter database tempdb modify file (name = templog, filename = 'T:\SQLFiles\templog.ldf')
Go

De volver a ejecutar el sp_helpfile ya vemos configuradas las nuevas rutas, queda reiniciar el servicio y ¡listo!

Como borrar un archivo NDF de una base en SQL Server 2005

Es fácil, más bien una papa, en dos pasitos sin mas ni mas. La cosa mas curiosa es que es mas mejor usar el Logical Name del archivo en lugar del Path físico del mismo.

Antes que nada, sacamos a todos de la base con:

ALTER DATABASE [YourDbName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Esto dispara un Rollback a todo que sea necesario y nos deja la base en modo monousuario para poder trabajar con tranquilidad.

De mas esta decir que no es recomendable hacerlo en producción directamente.

Entonces, lo primero que hacemos es vaciar el archivo, esto solo funciona si no hay transacciones pendientes en él. Basta con un SHRINK con EMPTYFILE así:

DBCC SHRINKFILE ([LogicalName], EMPTYFILE )
GO

Puede demorar bastante, dependiendo del equipo y el tamaño del NDF.

Después, lo pasamos a mejor vida, alterando la base con la indicación de remoción del archivo:

ALTER DATABASE [YourDbName] REMOVE FILE [LogicalName]
GO

Y claro, cuando terminen, no se olviden de habilitar el acceso a la base a los demas usuarios ;P

ALTER DATABASE Warehouse SET MULTI_USER

Ahora sí, listo!

Para realizar un back up de una base en particular en forma remota desde un Windows con las client tools instaladas podemos usar el DB2CMD desde un bat:

hacerbk.bat

DB2CMD.EXE -c -w -i DB2 -tf daf_backup.db2 -l D:\temp\db2\daf_backup.log -r D:\temp\db2\daf_backup.rpt

Contenido de daf_backup.db2

CONNECT TO DAF USER YYYYYY USING XXXXXX ;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET;
BACKUP DATABASE DAF USER YYYYYY USING XXXXXX TO “/backups/nuevo” WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1;
CONNECT TO DAF USER YYYYYY USING XXXXXX ;
UNQUIESCE DATABASE;
CONNECT RESET;
TERMINATE ;

El script resguarda una base de nombre DAF, lo hace con el usuario YYYYYY cuya clave es XXXXXX, siendo este el dueño de la isntancia de db2 (SYSADM, SYSCTRL o SYSMAINT minimo)

Verificar los permisos del usuarios que realiza el back up sobre /backups/nuevo