#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # Restauración COMPLETA desde backup local en dasu-sql4 # ========================================================== require_relative 'drones/lib/dasu_executor' puts "=== RESTAURACIÓN COMPLETA DESDE BACKUP LOCAL ===" puts "Fecha: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" puts "" # Script PowerShell para restore (sin drop, la BD ya no existe) ps_script = <<~PSCMD.strip $ErrorActionPreference = "Stop" $JSON_PATH = "C:\\temp\\restaurar_completo_output.json" $null = New-Item -ItemType Directory -Force -Path "C:\\temp" # Encontrar el backup más reciente Write-Host "[0/5] Buscando backup más reciente..." $backupFile = Get-ChildItem "F:\\BACKUP\\sysdasuten_FULL_*.bak" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if (-not $backupFile) { Write-Host "[!] No se encontró backup en F:\\BACKUP\\" exit 1 } $BACKUP_FILE = $backupFile.FullName Write-Host " Backup: $($backupFile.Name)" Write-Host " Tamaño: $([math]::Round($backupFile.Length / 1MB, 2)) MB" # Ver archivos lógicos en el backup Write-Host "`n[1/5] Leyendo archivos lógicos del backup..." $connString = "Server=localhost;Database=master;Integrated Security=true;TrustServerCertificate=yes;" $conn = New-Object System.Data.SqlClient.SqlConnection($connString) $conn.Open() $cmd = New-Object System.Data.SqlClient.SqlCommand("RESTORE FILELISTONLY FROM DISK = '$BACKUP_FILE'", $conn) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd) $ds = New-Object System.Data.DataSet $adapter.Fill($ds) $logicalNames = @{} if ($ds.Tables[0].Rows.Count -gt 0) { Write-Host " Archivos en el backup:" $ds.Tables[0].Rows | ForEach-Object { Write-Host " Tipo: $($_.Type) | Lógico: $($_.LogicalName) | Físico: $($_.PhysicalName)" if ($_.Type -eq 'D') { $logicalNames['data'] = $_.LogicalName } elseif ($_.Type -eq 'L') { $logicalNames['log'] = $_.LogicalName } } } Write-Host "`n[2/5] Restaurando desde backup..." Write-Host " Backup: $BACKUP_FILE" Write-Host " LogicalName data: $($logicalNames['data'])" Write-Host " LogicalName log: $($logicalNames['log'])" $restoreSql = @" RESTORE DATABASE sysdasuten FROM DISK = '$BACKUP_FILE' WITH REPLACE, RECOVERY, MOVE '$($logicalNames['data'])' TO 'F:\\DATA\\sysdasuten.mdf', MOVE '$($logicalNames['log'])' TO 'F:\\LOG\\sysdasuten_log.ldf' "@ Write-Host " SQL: $restoreSql" $cmd = New-Object System.Data.SqlClient.SqlCommand($restoreSql, $conn) $cmd.CommandTimeout = 600 $start = Get-Date try { $cmd.ExecuteNonQuery() | Out-Null $duracion = [math]::Round((New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds, 2) Write-Host " Restore completado en ${duracion}s" } catch { Write-Host " ERROR en restore: $_" exit 1 } Write-Host "`n[3/5] Poniendo BD en línea..." $cmd = New-Object System.Data.SqlClient.SqlCommand(" ALTER DATABASE sysdasuten SET MULTI_USER ", $conn) $cmd.ExecuteNonQuery() | Out-Null Write-Host " BD en línea" # Verificar restore Write-Host "`n[4/5] Verificando cantidad de registros..." $cmd = New-Object System.Data.SqlClient.SqlCommand(" SELECT COUNT(*) as total FROM sysdasuten.dbo.BonosAfiliado ", $conn) $total = $cmd.ExecuteScalar() Write-Host " Total registros en BonosAfiliado: $total" Write-Host "`n[5/5] Verificando IDs y fechas..." $cmd = New-Object System.Data.SqlClient.SqlCommand(" SELECT MAX(idsolicitud) as max_id FROM sysdasuten.dbo.BonosAfiliado ", $conn) $maxId = $cmd.ExecuteScalar() Write-Host " MAX(idsolicitud): $maxId" $cmd = New-Object System.Data.SqlClient.SqlCommand(" SELECT MAX(fecha) as ultima_fecha FROM sysdasuten.dbo.BonosAfiliado ", $conn) $ultimaFecha = $cmd.ExecuteScalar() Write-Host " Última fecha: $ultimaFecha" # Verificar registros con idsolicitud = 0 vs > 0 $cmd = New-Object System.Data.SqlClient.SqlCommand(" SELECT SUM(CASE WHEN idsolicitud = 0 THEN 1 ELSE 0 END) as con_cero, SUM(CASE WHEN idsolicitud > 0 THEN 1 ELSE 0 END) as con_mayor_cero FROM sysdasuten.dbo.BonosAfiliado ", $conn) $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd) $ds = New-Object System.Data.DataSet $adapter.Fill($ds) if ($ds.Tables[0].Rows.Count -gt 0) { $row = $ds.Tables[0].Rows[0] Write-Host " Con idsolicitud=0: $($row.con_cero)" Write-Host " Con idsolicitud>0: $($row.con_mayor_cero)" } $conn.Close() $resultado = @{ paso = "restore_completo" backup = $BACKUP_FILE total_registros = $total max_idsolicitud = $maxId ultima_fecha = $ultimaFecha timestamp = (Get-Date -Format "o") } $resultado | ConvertTo-Json | Out-File -FilePath $JSON_PATH -Encoding utf8 PSCMD puts "\n[1/2] Ejecutando restauración..." DasuExecutor.execute_ps_on_dasu(ps_script, output_path: 'C:\temp\restaurar_completo_output.json') puts "\n[2/2] Leyendo resultado..." begin resultado = DasuExecutor.read_json_from_dasu('C:\temp\restaurar_completo_output.json') puts "\n=== RESULTADO ===" puts " Backup: #{resultado['backup']}" puts " Total registros: #{resultado['total_registros']}" puts " MAX(idsolicitud): #{resultado['max_idsolicitud']}" puts " Última fecha: #{resultado['ultima_fecha']}" rescue => e puts "[!] Error leyendo resultado: #{e.message}" end puts "\n✅ Restauración completada"