作者|不剪发的Tony老师责编|张文
来源|来自CSDN博客
数据库定时任务可以用于实现定期的备份、统计信息采集、数据汇总、数据清除与优化等。PostgreSQL没有提供类似Oracle、MySQL以及MicrosoftSQLSever的外置任务调度功能,因而本文给你们介绍一下PostgreSQL数据库中实现定时任务的4种方式。
操作系统定时任务
Linux定时任务(crontab)或则Windows任务计划程序(TaskScheduler)为我们提供了一个实现定时任务传统的技巧。以crontab为例linux定时执行sql,我们可以使用以下命令编辑任务列表:
crontab-e
之后在打开的文件中使用以下格式降低一行数据:
#分钟小时月份中的某三天月份礼拜命令#(0-59)(0-23)(1-31)(1-12)(0-7[7or0==Sunday])
其中的前五个数组表示执行命令的时间,可以使用星号(*)匹配所有的时间。诸如,将设置为星号表示每位月都执行命令。
举例来说linux定时执行sql,输入以下内容表示每晚零点执行数据库逻辑备份操作。
00***pg_dump--no-password-Uuserdb_name>backup.sql
为了安全起见不要直接输入密码,而是应当将密码加入.pgpass文件,而且将该文件的权限设置为仅当前用户可见:
chmod600.pgpass
pgAgent
pgAgent是一个用于PostgreSQL数据库的任务调度代理,才能基于复杂的调度计划运行多步骤的批处理、shell脚本以及SQL命令。对于Unix/Linux系统,pgAgent以后台进程的形式运行;对于Windows系统,pgAgent以服务的方式运行。
安装pgAgent
PgAdmin4管理工具集成了pgAgent的功能,而且这三者须要单独安装。我们可以通过官方网站下载PgAdmin4以及pgAgent。具体的安装步骤和注意事项可以参考官网文档。安装完成以后,我们可以在PgAdmin4一侧导航树中听到“pgAgentJobs”节点。
创建定时任务
右键点击“pgAgentJobs”节点,选择“Create”>“pgAgentJob”创建一个新的定时任务。
其中,“General”页面可以输入一些基本信息,包括任务的名称。“Steps”页面可以设置多个操作步骤,包括执行的脚本或则SQL句子等。“Schedules”页面用于定义任务执行的时间计划。“SQL”页面可以显示创建或则更改任务的句子。
点击“Save”按钮保存设置并创建任务,之后我们就可以在“pgAgentJob”节点下见到创建的任务。
pg_cron
pg_cron是由citusdata公司开发的一个PostgreSQL定时任务插件(类似于Oracle中的DBMS_SCHEDULER)。pg_cron作为一个后台工作进程运行adobe air linux,使用类似cron的编辑句型,准许直接在数据库中执行定时任务。诸如:
--每周六3:30am(GMT)删掉历史记录SELECTcron.schedule('303**6',$$DELETEFROMeventsWHEREevent_time<now-interval'1week'$$);schedule----------42
--每晚10:00am(GMT)执行清除作业SELECTcron.schedule('nightly-vacuum','010***','VACUUM');schedule----------43
--将清除作业更改为3:00am(GMT)SELECTcron.schedule('nightly-vacuum','03***','VACUUM');schedule----------43
--停止计划中的任务SELECTcron.unschedule('nightly-vacuum');unschedule------------t(1row)
SELECTcron.unschedule(42);unschedule------------t
安装pg_cron
pg_cron目前只支持Linux操作系统。对于RedHat、CentOS以及Fedora等操作系统可以使用以下命令进行安装(PostgreSQL12):
sudoyuminstall-ypg_cron_12
对于Debian以及Ubuntu可以使用以下命令进行安装(PostgreSQL12):
sudoapt-get-yinstallpostgresql-12-cron
另外,我们也可以使用源码进行编译安装:
gitclonecdpg_cron#Ensurepg_configisinyourpath,e.g.exportPATH=/usr/pgsql-12/bin:$PATHmake&&sudoPATH=$PATHmakeinstall配置pg_cron
为了在启动PostgreSQL时运行pg_cron后台工作进程,我们须要将pg_cron添加到postgresql.conf文件中的shared_preload_libraries配置项。默认情况下嵌入式linux培训,pg_cron后台进程使用postgres数据库获取所需的元数据。并且我们也可以使用cron.database_name配置参数进行设置。
shared_preload_libraries='pg_cron'cron.database_name='postgres'
重启PostgreSQL:
sudoservicepostgresql-12restart
之后我们可以使用以下命令创建pg_cron函数以及元数据相关的表:
--使用superuser运行以下命令CREATEEXTENSIONpg_cron;
--可选操作,为其他用户授予访问权限
GRANTUSAGEONSCHEMAcronTOusername;
pg_timetable
pg_timetable是由CYBERTEC公司开发的PostgreSQL作业调度程序,提供了灵活的配置方法和许多中级功能。包括由多个任务组成的任务链、支持SQL命令和可执行程序、内置任务(比如发送短信)、完全基于数据库的配置和日志功能、cron风格的计划调度、并发执行的保护等。
安装pg_timetable
首先,我们可以使用官方发布的二补码安装程序安装pg_timetable,目前支持Windows、Linux以及macOS操作系统。
另外,官方的docker镜像可以点此下载。
master分支的latest标签是最新版本,使用命令行的运行方法如下:
dockerrun--rmcybertecpostgresql/pg_timetable:latest-h10.0.0.3-p54321-cworker001
指定环境变量的方法如下:
dockerrun--rm-ePGTT_PGHOST=10.0.0.3-ePGTT_PGPORT=54321cybertecpostgresql/pg_timetable:latest-cworker001
除此之外,我们也可以使用源码进行编译安装。首先下载并安装Go语言环境,之后使用goget命令拷贝pg_timetable源码:
$envGIT_TERMINAL_PROMPT=1goget/cybertec-postgresql/pg_timetable/Usernamefor'':Passwordfor'@':
运行pg_timetable:
$cd~/go/src//cybertec-postgresql/pg_timetable/$gorunmain.go--dbname=dbname--clientname=worker001--user=scheduler--password=strongpwd
或则,也可以编译成二补码程序并运行:
$gobuild$./pg_timetable--dbname=dbname--clientname=worker001--user=scheduler--password=strongpwd
假如想要运行项目中的所有测试,可以执行以下命令:
$cd~/go/src//cybertec-postgresql/pg_timetable/$goget/stretchr/testify/$gotest./...
也可以使用postgresdocker镜像运行测试:
$RUN_DOCKER=truegotest./...使用pg_timetable
pg_timetable独立于PostgreSQL服务器运行,相当于一个顾客端进程。安装完成以后,执行以下命令运行pg_timetable程序:
#./pg_timetable
ApplicationOptions:-c,--clientname=Uniquenameforapplicationinstance-v,--verboseShowverbosedebuginformation[$PGTT_VERBOSE]-h,--host=PGconfigDBhost(default:localhost)[$PGTT_PGHOST]-p,--port=PGconfigDBport(default:5432)[$PGTT_PGPORT]-d,--dbname=PGconfigDBdbname(default:timetable)[$PGTT_PGDATABASE]-u,--user=PGconfigDBuser(default:scheduler)[$PGTT_PGUSER]-f,--file=SQLfiletoexecuteduringstartup--password=PGconfigDBpassword(default:somestrong)[$PGTT_PGPASSWORD]--sslmode=[disable|require]WhatSSLpriorityuseforconnection(default:disable)--pgurl=PGconfigDBurl[$PGTT_URL]--initInitializedatabaseschemaandexit.Canbeusedwith--upgrade--upgradeUpgradedatabasetothelatestversion--no-program-tasksDisableexecutingofPROGRAMtasks[$PGTT_NOPROGRAMTASKS]
源代码的sample目录中提供了大量的示例可以参考。以下命令可以创建一个8月份00:05运行“MyJob”的定时任务:
SELECTtimetable.job_add('MyJob','SELECTpublic.my_func',NULL,'SQL','50*8*',live:=TRUE);
以下命令表示从0点到20点,每两个小时的23分时运行“MyJob”任务:
SELECTtimetable.job_add('MyJob','SELECTpublic.my_func',NULL,'SQL','230-20/2***',live:=TRUE);
pg_timetable计划任务的完整配置由3个阶段组成:
据悉,为了给基本任务传递控制参数,任务链中的任务都可以附送一个执行参数。详尽的配置方式和案例可以参考官方网站。
总结
本文介绍了在PostgreSQL数据库中实现定时任务的4种方式,包括操作系统定时任务、pgAgent代理、pg_cron插件以及pg_timetable工具。
来源链接: