docs & tools: Actualización de informes y scripts de migración DASUTEN
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user