Windows 环境 Java 调用 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 很可能会被影响到, 可能突然就给干崩溃了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Protel DXP 面试题详解及参考答案(4万字长文)

解释Protel DXP的基本工作流程。 Protel DXP(现已更名为Altium Designer)是一款用于电子设计自动化(EDA)的软件,主要应用于印刷电路板(PCB)设计。其基本工作流程通常包括以下几个阶段: 项目创建与配置: 开始一个新的设计项目时,首先需要创建一个项目文件,在这个文件…

大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

SQL注入万字详解,基于sqli-labs(手注+sqlmap)

目录 一、什么是SQL 1.什么是SQL 2.SQL的作用 3.MySQL基础知识 4.SQL增、删、改语句 *5.SQL查询语句 二、什么是SQL注入 1.SQL注入原理: 2.SQL注入: 3.SQL注入危害: 4.SQL注入技术分类: 5.防御方法:使用参…

javaEE-01-tomcat

文章目录 javaWebTomcat启动 Tomcat 服务器测试服务器是否成功停止tomcat服务器修改服务器的端口号 Idea整合tomcat服务器 javaWeb 所有通过 Java 语言编写可以通过浏览器访问的程序的总称,是基于请求和响应来开发的。 请求: 客户端给服务器发送数据(Request)响应: 服务器给客…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑:自动驾驶的先锋与挑战 近段时间,由萝卜快跑引发的自动驾驶事件如火如荼,成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者,其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…

C语言 之 理解指针(5)

转移表 本章主要讲的是函数指针数组的用途&#xff1a;转移表 让我们来看看下面的代码&#xff1a; 计算器的一般实现&#xff1a; #include <stdio.h> int add(int a, int b) {return a b; //加法函数 } int sub(int a, int b) {return a - b; //减法函数 } int mul…

Pytorch使用教学2-Tensor的维度

在PyTorch使用的过程中&#xff0c;维度转换一定少不了。而PyTorch中有多种维度形变的方法&#xff0c;我们该在什么场景下使用什么方法呢&#xff1f; 本小节我们使用的张量如下&#xff1a; # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …

common-intellisense:助力TinyVue 组件书写体验更丝滑

本文由体验技术团队Kagol原创~ 前两天&#xff0c;common-intellisense 开源项目的作者 Simon-He95 在 VueConf 2024 群里发了一个重磅消息&#xff1a; common-intellisense 支持 TinyVue 组件库啦&#xff01; common-intellisense 插件能够提供超级强大的智能提示功能&…

Ubuntu升级软件或系统

Ubuntu升级软件或系统 升级Ubuntu系统通常是一个相对简单的过程&#xff0c;但在进行操作之前&#xff0c;请务必备份重要数据以防万一。下面是升级Ubuntu系统的一般步骤&#xff1a; 使用软件更新工具升级系统 打开终端&#xff1a; 按下 Ctrl Alt T 组合键打开终端。 更…

Java设计模式—单例模式(Singleton Pattern)

目录 一、定义 二、应用场景 三、具体实现 示例一 示例二 四、懒汉与饿汉 饿汉模式 懒汉模式 五、总结 六、说明 一、定义 二、应用场景 ‌单例模式的应用场景主要包括以下几个方面&#xff1a; ‌日志系统&#xff1a;在应用程序中&#xff0c;通常只需要一个日…

【JS逆向课件:第十三课:异步爬虫】

回顾 并行和并发 表示程序/计算机具有处理多个任务的能力 并行表示可以同时处理多个任务&#xff08;几个多核CPU&#xff09;并发无法同时处理多个任务&#xff0c;但是可以基于时间片轮转法在多任务间快速切换的执行任务。 同步和异步 在基于并行或者并发处理任务的时候&am…

链式法则和自动求导

向量链式法则 说明&#xff1a; 1.第一个式子&#xff0c; y是标量&#xff0c;u是标量&#xff0c;x是n维向量 2.第二个式子&#xff0c;y是标量&#xff0c;u是k维向量&#xff0c;x是n维向量&#xff0c;所以y对u求导是k维的行向量&#xff0c;u对x求导是k行n列的矩阵&…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

消息队列的面试题

目录 面试题消息队列的使用场景场景描述与数据数据流程与具体数据优势与数据支持流量控制的举例场景&#xff1a;在线视频平台的直播流传输场景描述流量控制策略数据与效果 面试题 为什么使用消息队列&#xff1f; 消息队列有什么优点和缺点&#xff1f; Kafka、ActiveMQ、Rab…

opencv:基于阈值的分割方法(固定阈值和自适应阈值)

1、基于阈值的分割 (1)固定阈值分割 将图像分为两个部分&#xff1a;黑和白两个区域 /*author 还下着雨ZG * brief 固定阈值图像分割 * param[in] imSrc, 待分割的图像 * param[out] imSegment, 分割后的图像 * param[in] threVal, 输入的阈值 * return, 返回正整数表示图像…

Ubuntu设置时区

Ubuntu设置时区 在 Ubuntu 中设置时区可以通过以下几个步骤来完成&#xff1a; 方法一&#xff1a;使用命令行 查看当前时区设置&#xff1a; 可以使用以下命令查看当前系统的时区设置&#xff1a; timedatectl如果你想要详细信息&#xff0c;可以运行&#xff1a; timedatec…

ESP32-S3-DevKitC-1开发记录帖——与MPU6050进行姿态检测

目录 MPU6050传感器——姿态检测 1.姿态检测 1.1 基本认识 1&#xff09;坐标系 2&#xff09;姿态角的关系 3&#xff09;陀螺仪检测的缺陷 4&#xff09;利用加速度计检测角度 5&#xff09;利用磁场检测角度 1.2 姿态融合与四元数 1.3传感器工作原理 1.4 MPU6050模…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

新电脑如何设置 npm 源及查看源、安装 cnpm、pnpm 和 yarn 的详细教程

当你获得一台新电脑&#xff0c;或需要在现有电脑上优化 JavaScript 和 Node.js 的开发环境时&#xff0c;正确配置 npm 是一步不可少的过程。本教程将详细指导你如何设置 npm 源&#xff0c;查看当前源&#xff0c;以及如何安装 cnpm、pnpm 和 yarn。 1. 设置 npm 源 npm (N…

one-api 源码调试配置

本文主要介绍通过 VSCode 调试 one-api 源码。 一、环境配置 1.1 VSCode 和 one-api 安装 首先,确保已经安装了 VSCode(下载链接)和 one-api 源码(下载链接)已下载并安装了依赖 1.2 安装 Go 插件 在 VSCode 中,安装 Go 插件。 1.3 安装 dlv 调试包 可以通过下载源码…