当前位置: 首页 > news >正文

Windows 环境 batch 脚本实现 PG 数据库恢复功能

直接上代码

@echo on
rem set PG_ROOT_DIR=D:\PostgreSQL\
rem 实例: recover_all_db.bat D:\PostgreSQL E:\ProjectCode\ums_vm_server-ums
set PG_ROOT_DIR=%1
set BASE_DIR=%PG_ROOT_DIR%\pgsql
REM SET PGHOST=127.0.0.1
set PSQL="%BASE_DIR%\bin\psql.exe"
set PG_DUMP="%BASE_DIR%\bin\pg_dump.exe"
set PG_CTL="%BASE_DIR%\bin\pg_ctl.exe"
set PG_ISREADY="%BASE_DIR%\bin\pg_isready.exe"
set PG_RESTORE="%BASE_DIR%\bin\pg_restore.exe"
set PGDATA=%BASE_DIR%\data
set LOG_PATH=%BASE_DIR%\recover_all_db_log
set LOGF_FILE="%LOG_PATH%\db_recover_progress.log"
rem 恢复数据库之前做的一次预先备份
set SERVER_DIR=%2
set PG_BACKUP_PRE=%SERVER_DIR%\backup\pg_backup_prev
set PG_RECOVER_FILE_PATH=%SERVER_DIR%\backup\recover\
set TIMEOUT=300echo %date:~0,10%_%time%: ----------脚本开始执行------------ >> %LOGF_FILE% 2>&1
echo %date:~0,10%_%time%:以 6666 为初始端口开始扫描一个可用的端口启动数据库, 作为后面切换端口使用set CURRENT_PG_PORT=6666
set PG_NOT_USED_PORT=6666:check_port
netstat -ano | findstr 0.0.0.0:%CURRENT_PG_PORT% >> %LOGF_FILE% 2>&1
if errorlevel 1 (set PG_NOT_USED_PORT=%CURRENT_PG_PORT%)else (set /a CURRENT_PG_PORT+=1 ping -n 3 localhost >NULgoto check_port
)
echo Available port: %PG_NOT_USED_PORT%
set PGPORT=%PG_NOT_USED_PORT%del /Q dbs.tmp >NUL 2>&1
mkdir %PG_BACKUP_PRE% >NUL 2>&1
mkdir %LOG_PATH%  >NUL 2>&1
echo %date:~0,10%_%time%:停 POSTGRESQL 服务  
echo %date:~0,10%_%time%:停 POSTGRESQL 服务  >> %LOGF_FILE% 2>&1
REM net stop POSTGRESQL  >> %LOGF_FILE% 2>&1net session >nul 2>&1
if %errorLevel% == 0 (echo 已经具有管理员权限。:: 在这里添加需要管理员权限执行的命令net stop POSTGRESQL  >> %LOGF_FILE% 2>&1
) else (echo 尝试以管理员权限重新运行...:: 创建VBS脚本来执行批处理文件本身setlocal EnableDelayedExpansionREM set "batchPath=%~dp0\test5.bat"REM echo  "batchPath=!batchPath!"echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getAdmin.vbs"echo UAC.ShellExecute "cmd.exe", "/c ""net stop POSTGRESQL""", "", "runas", 1 >> "%temp%\getAdmin.vbs"REM echo UAC.ShellExecute "!batchPath!", "", "", "runas", 1 >> "%temp%\getAdmin.vbs"REM echo UAC.ShellExecute "!batchPath!", "", "", "runas", 1 >> "%temp%\getAdmin.vbs""%temp%\getAdmin.vbs"del "%temp%\getAdmin.vbs"REM exit /B
)
ping -n 60 localhost >NUL
echo %date:~0,10%_%time%:停 POSTGRESQL 服务完成  >> %LOGF_FILE% 2>&1
setlocal enabledelayedexpansion
set /A counter=0
set PING_INTERVAL=3
set PING_MAX_COUNT=100:check_pg_status
REM ping -n 3 127.0.0.1 set /A counter+=1
if !counter! equ %PING_MAX_COUNT% (echo 数据库长时间无法正常停止, 恢复流程终止echo 数据库长时间无法正常停止, 恢复流程终止 >> %LOGF_FILE% 2>&1goto :eof
)
%PG_ISREADY% -Upostgres -t %PING_INTERVAL%
if errorlevel 1 (echo 不接受连接	echo 不接受连接	>> %LOGF_FILE% 2>&1if exist "%PGDATA%\postmaster.pid" (echo 文件 postmaster.pid 存在,说明数据库没有停止彻底echo 文件 postmaster.pid 存在,说明数据库没有停止彻底 >> %LOGF_FILE% 2>&1goto check_pg_status) else (echo 文件 postmaster.pid 不存在,说明数据已经停止彻底 echo 文件 postmaster.pid 不存在,说明数据已经停止彻底 >> %LOGF_FILE% 2>&1)
) else (echo 数据库当前接受连接,需要继续检测 echo 数据库当前接受连接,需要继续检测 >> %LOGF_FILE% 2>&1goto check_pg_status
)echo %date:~0,10%_%time%:以新的端口 6666 启动数据库
echo %date:~0,10%_%time%:以新的端口 6666 启动数据库 >> %LOGF_FILE% 2>&1
echo port=%PGPORT% >"%PGDATA%\postgresql.auto.conf"
%PG_CTL% start -D "%PGDATA%" -t %TIMEOUT%echo %date:~0,10%_%time%:获取数据库列表
echo %date:~0,10%_%time%:获取数据库列表 >> %LOGF_FILE% 2>&1
%PSQL% -qAt  -U postgres  -p %PGPORT%  -c "select datname from pg_database where datname not in ('template0','template1','postgres') order by datname" >> dbs.tmpecho '%date:~0,10%_%time%:------遍历数据库------' 
echo '%date:~0,10%_%time%:------遍历数据库------' >> %LOGF_FILE% 2>&1
echo '%date:~0,10%_%time%:---------数据库备份开始-----------'
echo '%date:~0,10%_%time%:---------数据库备份开始-----------' >> %LOGF_FILE% 2>&1
setlocal enabledelayedexpansion
for /F "delims=" %%a in (dbs.tmp) do (rem 在这里你可以对每行进行进一步处理set "current_time=!date:~0,10!_!TIME!"echo !current_time!:备份数据库 %%a echo !current_time!:备份数据库 %%a >> %LOGF_FILE% 2>&1%PG_DUMP% -U postgres  -p %PGPORT% -Fc -C -c --if-exists -f "%PG_BACKUP_PRE%\%%a.sql" %%a
)
endlocal
echo '%date:~0,10%_%time%:---------数据库备份完成-----------'
echo '%date:~0,10%_%time%:---------数据库备份完成-----------' >> %LOGF_FILE% 2>&1echo '%date:~0,10%_%time%:---------数据库恢复开始-----------'
echo '%date:~0,10%_%time%:---------数据库恢复开始-----------' >> %LOGF_FILE% 2>&1
setlocal
for /F "delims=" %%a in (dbs.tmp) do (rem 在这里你可以对每行进行进一步处理set "current_time=!date:~0,10!_!TIME!"echo !current_time!:恢复数据库 %%a echo !current_time!:恢复数据库 %%a >> %LOGF_FILE% 2>&1%PSQL% -U postgres -d postgres  -p %PGPORT% -c "DROP DATABASE  IF EXISTS \"%%a\" ;"   >> %LOGF_FILE% 2>&1%PSQL% -U postgres -d postgres  -p %PGPORT% -c "CREATE DATABASE \"%%a\" WITH TEMPLATE = template0 ENCODING = 'UTF8'  LOCALE = 'C';"   >> %LOGF_FILE% 2>&1%PG_RESTORE% -U postgres -d "%%a"  -p %PGPORT%  "%PG_RECOVER_FILE_PATH%\%%a.sql"   >> %LOGF_FILE% 2>&1
)
endlocal
echo '%date:~0,10%_%time%:---------数据库恢复完成-----------'
echo '%date:~0,10%_%time%:---------数据库恢复完成-----------' >> %LOGF_FILE% 2>&1echo '%date:~0,10%_%time%:------------重启数据库------------'
echo. > "%PGDATA%\postgresql.auto.conf"
%PG_CTL% stop  -m fast -D "%PGDATA%" -t %TIMEOUT% -wnet session >nul 2>&1
if %errorLevel% == 0 (echo 已经具有管理员权限。:: 在这里添加需要管理员权限执行的命令net start POSTGRESQL  >> %LOGF_FILE% 2>&1
) else (echo 尝试以管理员权限重新运行...:: 创建VBS脚本来执行批处理文件本身setlocal EnableDelayedExpansionREM set "batchPath=%~dp0\test6.bat"REM echo  "batchPath=!batchPath!"echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getAdmin.vbs"echo UAC.ShellExecute "cmd.exe", "/c ""net start POSTGRESQL""", "", "runas", 1 >> "%temp%\getAdmin.vbs"REM echo UAC.ShellExecute "!batchPath!", "", "", "runas", 1 >> "%temp%\getAdmin.vbs"REM echo UAC.ShellExecute "!batchPath!", "", "", "runas", 1 >> "%temp%\getAdmin.vbs""%temp%\getAdmin.vbs"del "%temp%\getAdmin.vbs"REM exit /B
)
ping -n 3 localhost >NULecho '%date:~0,10%_%time%:---------删除临时文件  -----------'
echo '%date:~0,10%_%time%:---------删除临时文件  -----------' >> %LOGF_FILE% 2>&1
del /Q dbs.tmp >NUL 2>&1
echo %date:~0,10%_%time%: ----------脚本结束执行------------ >> %LOGF_FILE% 2>&1

不得不吐槽下 Windows 上维护数据库真是不爽, 各种异常, Windows 当做数据库服务器就是垃圾,尤其是不干净的 Windows 系统, 什么杀毒软件,垃圾软件安装了, Windows 版本的 PG 很可能会被影响到, 可能突然就给干崩溃了.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从代码层面熟悉UniAD,开始学习了解端到端整体架构
  • 【软件测试】--接口测试
  • WordPress主题追格企业官网主题免费开源版V1.1.6
  • 【剑指offer】
  • Swift学习入门,新手小白看过来
  • package:mine android studio新过滤规则及其用法 Filter使用技巧
  • 【AI大模型】-- 应用部署
  • 经典文献阅读之--World Models for Autonomous Driving(自动驾驶的世界模型:综述)
  • 贪心算法总结(2)
  • 排序算法:冒泡排序,golang实现
  • 20.rabbitmq插件实现延迟队列
  • JAVA(IO流-字节流)day 7.29
  • php将数字转为中文汉字
  • 计算机毕业设计LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能
  • Javascript前端面试基础4【每日学习并更新10】
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • express如何解决request entity too large问题
  • Idea+maven+scala构建包并在spark on yarn 运行
  • javascript数组去重/查找/插入/删除
  • js对象的深浅拷贝
  • Just for fun——迅速写完快速排序
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • vue-router的history模式发布配置
  • 翻译--Thinking in React
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前嗅ForeSpider采集配置界面介绍
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • UI设计初学者应该如何入门?
  • 如何用纯 CSS 创作一个货车 loader
  • #预处理和函数的对比以及条件编译
  • (day 12)JavaScript学习笔记(数组3)
  • (Java入门)学生管理系统
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十八)SpringBoot之发送QQ邮件
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习总结16)C++模版2
  • (转)ORM
  • (自适应手机端)行业协会机构网站模板
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET : 在VS2008中计算代码度量值
  • .net core Swagger 过滤部分Api
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .Net 路由处理厉害了
  • .Net 应用中使用dot trace进行性能诊断
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET委托:一个关于C#的睡前故事
  • /var/lib/dpkg/lock 锁定问题
  • @AliasFor 使用