在Linux环境中,可以使用apt-get安装PostgreSQL
sudo apt-get update
sudo apt-get install postgresql postgresql-client
安装完毕后,系统会创建一个数据库超级用户 postgres,密码为空。可以通过下面的命令切换到超级用户:
sudo -i -u postgres
这时使用以下命令进入 postgres,输出以下信息,说明安装成功:
~$ psql
psql (9.5.17)
Type "help" for help.
postgres=#
输入\q命令退出 PostgreSQL 提示符.
PostgreSQL 安装完成后默认是已经启动的,但是也可以通过下面的方式来手动启动服务。
sudo /etc/init.d/postgresql start # 开启
sudo /etc/init.d/postgresql stop # 关闭
sudo /etc/init.d/postgresql restart # 重启
默认情况下 PostgreSQL 安装完成后,自带了一个命令行工具 SQL Shell(psql)。
Linux 系统可以直接切换到 postgres 用户来开启命令行工具。
| 命令 | 解释 |
|---|---|
\l,\list |
查看系统中所有数据库 |
\c database |
切换数据库 |
SELECT current_database(); |
查看当前连接的是哪个数据库 |
\dt |
查看数据库中的所有表 |
\dt *.* |
列出当前数据库中所有用户创建的表信息 |
\d tablename |
查看某个表的详细结构 |
在 PostgreSQL 中,psql 本身主要用于与数据库进行交互,并不直接提供备份功能,但借助相关工具可以实现完整备份、增量备份和差异备份,下面详细介绍这三种备份方式:
完整备份会复制指定数据库中的所有数据和对象结构,是最基础的备份方式,能提供一个独立且完整的数据库副本,方便进行恢复操作。
虽然完整备份的恢复速度较快,但它需要较多的存储空间,并且备份频率较低,通常每天执行一次。
完整备份示例:
pg_dump -U 用户名 -F c -f full_backup.dump 数据库名
恢复完整备份:
pg_restore -U 用户名 -d 数据库名 -v 备份文件路径
增量备份仅备份自上次备份以来发生更改的数据。它与完整备份结合使用,通常需要一个完整备份作为基础。增量备份会记录从上次备份以来的事务日志中的更改,并将这些更改保存到备份文件中。这意味着增量备份文件相对较小,但在恢复时需要应用所有的增量备份,可能需要更多的时间。
增量备份示例:
pg_dump -U 用户名 -F c -f full_backup.dump 数据库名
pg_basebackup -U 用户名 -D /path/to/incremental_backup -Ft -Xs -z -P -R
pg_restore -U 用户名 -d 数据库名 -F c -c incremental_backup.dump
差异备份介于完整备份和增量备份之间。它备份自上次完整备份以来发生更改的数据,而不是自上次备份以来的所有更改。差异备份通常比增量备份速度更快,因为它只需备份最新的更改,但在恢复时需要应用完整备份和差异备份,因此恢复时间相对较长。
差异备份示例:
pg_basebackup -U 用户名 -D /path/to/differential_backup -Ft -Xs -z -P -R
pg_basebackup -U 用户名 -D /path/to/differential_backup -Ft -Xs -z -P -R
pg_restore -U 用户名 -d 数据库名 -F c -c differential_backup.dump
编写shell脚本:
#!/bin/bash
cur_time=$(date '+%Y-%m-%d')
sevendays_time=$(date -d -7days '+%Y-%m-%d')
# 删除7天前的备份文件
echo "Starting Backup PostgreSQL..."
if [ -f "/home/postgres/psql_backups/pgsql-backup.$sevendays_time.tar.gz" ]; then
rm -rf /home/postgres/psql_backups/pgsql-backup.$sevendays_time.tar.gz
fi
# 执行备份操作
pg_dumpall -U postgres -p 5432 > "pgsql-backup.$cur_time.dmp"
if [ $? -ne 0 ]; then
echo "Error: pg_dumpall failed."
exit 1
fi
# 压缩备份文件
tar zcvf "/home/postgres/psql_backups/pgsql-backup.$cur_time.tar.gz" *.dmp
if [ $? -ne 0 ]; then
echo "Error: tar failed."
exit 1
fi
echo "Remove temp file..."
# 删除临时的.dmp文件
rm -f pgsql-backup.*.dmp
echo "Finish Backup..."
添加权限
chmod 755 ./backup.sh
配置git自动上传
#!/bin/bash
# 定义变量
GIT_REPO_DIR="/home/postgres/psql_backups" # 替换为你的 Git 仓库本地路径
COMMIT_MESSAGE="Automated commit: $(date +'%Y-%m-%d %H:%M:%S')" # 提交信息,包含当前日期和时间
# 进入 Git 仓库目录
cd "$GIT_REPO_DIR" || {
echo "无法进入 Git 仓库目录: $GIT_REPO_DIR"
exit 1
}
# 拉取最新代码,避免冲突
git pull origin main # 如果你使用的分支不是 main,请替换为实际分支名
# 添加所有更改的文件到暂存区
git add .
# 检查是否有文件被修改或添加
CHANGES=$(git status --porcelain)
if [ -z "$CHANGES" ]; then
echo "没有文件被修改,无需提交。"
exit 0
fi
# 提交更改
git commit -m "$COMMIT_MESSAGE"
# 推送更改到远程仓库
git push origin main # 如果你使用的分支不是 main,请替换为实际分支名
# 检查推送是否成功
if [ $? -eq 0 ]; then
echo "代码已成功推送到远程仓库。"
else
echo "推送代码到远程仓库时出错。"
fi
crontab设定定时备份
[root@localhost ~]# crontab -e
0 2 * * * /home/postgres/backup.sh
0 3 * * * /home/postgres/git_upload.sh
no crontab for root - using an empty one
crontab: installing new crontab