[postgresql]自动备份实践

前言

数据库的备份是必要的因为—万一自己手惨删库了还可以恢复一下不至于一死谢罪吧。。。

实践

添加密码文件进行单独导出

在你本机的用户下面添加一个文件,

touch ~/.pgpass
vim ~/.pgpass

内容如下:

数据库host:端口:数据库名称:数据库用户:数据库密码

这里我解释一下吧。
填写数据库ip时候注意一点。就是假如用localhost这个的话,就直接用明文密码匹配,如果是用127.0.0.1或者 xxx.xxx.xxx.xx 这样的ip地址都是走的md5密文匹配。
就是说,填写localhost时候,你后面的密码就要填明文,如果填写的是127.0.0.1这些ip地址,后面的就必须是postgresql经过md5加密的密文啦。
如果填的是127.0.0.1后面的是明文密码,结果就是会产生:

Peer authentication failed for user “postgres”

这样的错误。

所以,下面就是真实的.pgpass内容:

localhost:5432:test_data_base:db_user_001:明文密码

下面是备份整个库的命令:

pg_dump -h localhost -U db_user_001 test_data_base > ~/dist/db_bak/test_data_base.bak

注意,host,user,dbname一定要与pgpass文件上面的对应起来才行。

如果只想导出一张表的数据那怎么做呢

pg_dump  -h localhost -U dbuser -d test_data_base -a -t user  > ~/dist/db_bak/tbl_user.bak
-a 表示只导出数据,不要别的, -t 表示表 后面带表名称 譬如,用户表 user。

自动备份

参考了:

作者:aladdin_sun 
来源:CSDN 
原文:https://blog.csdn.net/sunbocong/article/details/77936601 
版权声明:本文为博主原创文章,转载请附上博文链接!
#!/bin/bash
cur_time=$(date '+%Y-%m-%d')
sevendays_time=$(date -d -7days '+%Y-%m-%d')
export PGPASSWORD=oracle
echo "Starting Backup PostgreSQL ..."
rm -rf pgsql-backup.$sevendays_time.tar.gz
pg_dumpall -U postgres -p 5432>"pgsql-backup.$cur_time.dmp"
tar zcvf "/var/lib/pgsql/pgsql-backup.$cur_time.tar.gz" *.dmp
echo "Remove temp file ..."
rm -rf pgsql-backup.*.dmp
echo "Finish Backup ..."


那么实际上我们的脚本是:

#!/bin/bash
cur_time=$(date '+%Y-%m-%d')
echo "current time: is $cur_time"
cur_folder_path="dist/db_backup/$cur_time"
sevendays_time=$(date -d -7days '+%Y-%m-%d')
last_folder_path="dist/db_backup/$sevendays_time"

mkdir -p dist/db_backup/$cur_time
rm -rf dist/db_backup/$sevendays_time
rm -rf dist/db_backup/$sevendays_time.tar.gz

echo "Starting Backup PostgreSQL ..."
pg_dump  -h localhost -U dbuser -d 我的数据库   > "dist/db_backup/$cur_time/db.dmp"

tar zcvf "dist/db_backup/$cur_time.tar.gz" "$cur_folder_path/db.dmp"
echo "Remove temp file ..."
rm -rf "$cur_folder_path/*.dmp"
echo "Finish Backup ..."

添加定时任务

crontab -e

然后:
添加代码:

* 2 * * * /home/root/pg_backup.sh

每天凌晨两点执行备份脚本

重启cron服务

/sbin/service  crond reload

scp远程传输文件

每天备份是很好的一个习惯。。不过,我们也要顺便将备份的文件放到必要的备份服务器去。

免密码

在a机器上面,执行:

ssh-keygen -t rsa

注意,机器b上面如果是新安装的那就不会有.ssh这个文件夹的,请给b也运行一下:ssh-keygen -t rsa
然后:

scp -P ssh的端口 .ssh/id_rsa.pub 远程机器的帐号@远程机器的ip地址:.ssh/authorized_keys

完成这一步以后,以后用scp就不会提示密码,然后,就可以尽情上传文件了,譬如:

scp -P ssh的端口 dist/db_backup/2019-05-28.tar.gz 机器b的帐号@机器b的ip:dist/db_backup/

那么,请在pg_backup.sh后面再添加一行代码以上传文件。

结果

最后的执行结果应该是:

current time: is 2019-05-28
Starting Backup PostgreSQL ...
dist/db_backup/2019-05-28/db.dmp
Remove temp file ...
Finish Backup ...
2019-05-28.tar.gz                                                                                                             100%  435KB 217.4KB/s   00:02    
finish upload to remote machine

集合了自动备份,压缩,免密码上传于一体。

参考

Centos 利用SCP两台机器复制文件

复制文件
将本地文件拷贝到远程
scp 文件名 –用户名@计算机IP或者计算机名称:远程路径

从远程将文件拷回本地
scp –用户名@计算机IP或者计算机名称:文件名 本地路径

命令格式

scp local_file remote_username@remote_ip:remote_folder 
或者 
scp local_file remote_username@remote_ip:remote_file 
或者 
scp local_file remote_ip:remote_folder 
或者 
scp local_file remote_ip:remote_file 
 
第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名; 
第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

复制目录
将本地目录拷贝到远程
scp -r 目录名 用户名@计算机IP或者计算机名称:远程路径

从远程将目录拷回本地
scp -r 用户名@计算机IP或者计算机名称:目录名 本地路径

命令格式

scp -r local_folder remote_username@remote_ip:remote_folder 
或者 
scp -r local_folder remote_ip:remote_folder 
 
第1个指定了用户名,命令执行后需要再输入密码; 
第2个没有指定用户名,命令执行后需要输入用户名和密码;

例子

scp -r /home/space/music/ [email protected]:/home/root/others/ 
scp -r /home/space/music/ www.cumt.edu.cn:/home/root/others/ 
 
参数详解
参数	描述
-a	尽可能将档案状态、权限等资料都照原状予以复制
-r	若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地
-f	若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制
-v	和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误
-C	使能压缩选项
-P	选择端口 . 注意 -p 已经被 rcp 使用
-4	强行使用 IPV4 地址
-6	强行使用 IPV6 地址
举例说明
把计算机名为“v111.nn”下所有的东西都拷贝到本机/home/admin/目录下
scp -r * v111.nn:/home/admin/ 
 
以admin的身份把IP地址为“192.168.219.125”,/home/admin/test目录下所有的东西都拷贝到本机/home/admin/目录下
scp -r  [email protected]:/home/admin/test  /home/admin/

SCP免密码传输

二、CentOS scp 不输入密码
1. 生成公私钥对
[root@cent7x64 ~]# ssh-keygen -t rsa

[root@cent7x64 .ssh]# cat ~/.ssh/id_rsa.pub

2. 拷贝生成生成的公私钥对至远程机器
将cat显示的内容复制至远程机器的~/.ssh/authorized_keys文件中

 

参考http://blog.csdn.net/nfer_zhuang/article/details/42646849
前提条件:两台CentOS主机拥有相同的用户名,假设主机A和主机B拥有相同的用户名binguo,只需下面两步
1.以binguo帐户名登录主机A,主目录下执行如下命令生成配对密钥,不用管提示,一路回车;
ssh-keygen -t rsa
2.将主目录下隐藏目录.ssh中的id_rsa.pub文件复制到主机B的binguo主目录的/.ssh/目录中,并重命名为authorized_keys。
cd .ssh
scp id_rsa.pub 主机B:/home/binguo/.ssh/authorized_keys
Ps.如果主机B上的authorized_keys文件存在,则用下面的语句追加进去
cat id_rsa.pub >> 主机B:/home/binguo/.ssh/authorized_keys
--------------------- 
作者:BingCorePower 
来源:CSDN 
原文:https://blog.csdn.net/binguo168/article/details/77461713 
版权声明:本文为博主原创文章,转载请附上博文链接!

Centos定时启动和清除任务

Centos定时启动和清除任务
因为需要定时并发执行任务,所以查到了crontab这个工具,介绍一下其用法:

SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root 
HOME=/ 
# run-parts 
01 * * * * root run-parts /etc/cron.hourly 
02 4 * * * root run-parts /etc/cron.daily 
22 4 * * 0 root run-parts /etc/cron.weekly 
42 4 1 * * root run-parts /etc/cron.monthly
   # run-parts 中:
  
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59 <br>第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。
方法一:

设置服务器定时启动

vim/etc/ crontab

1
2
#reboot 设定每天10:30重新启动 
30 10 * * * root /sbin/reboot
重新加载配置

/sbin/service crond reload

重启cron

/sbin/service crond restart

 

方法二:

直接在命令行下执行

[root@localhost ~]# crontab  -e  添加定时

*/10 17-18 * * * root tcpdump -i eth0 tcp port 80 -s 0 -w sohu1.txt

*/10 17-18 * * * root tcpdump -i eth0 tcp port 80 -s 0 -w sohu1.cap

wq退出

[root@localhost ~]# crontab -r   删除任务

[root@localhost ~]# crontab -l    显示任务

比如tcpdump 还在后台运行,则可以用killall tcpdump 

坚持不懈

postgresql数据库–psql、pg_dump命令带密码执行sql语句

pg_dump:

pg_dump -a -t tbl_test "host=127.0.0.1 hostaddr=127.0.0.1 port=5432 user=postgres password=123456 dbname=postgres" > /userdir/tbl_data

-a 参数是表示只导出数据,其他的额外信息不需要,该参数也可去掉

psql:

psql --command "select * from tbl_test;" "host=127.0.0.1 hostaddr=127.0.0.1 port=5432 user=postgres password=123456 dbname=postgres"
--------------------- 
作者:password-u 
来源:CSDN 
原文:https://blog.csdn.net/u013992330/article/details/53942272 
版权声明:本文为博主原创文章,转载请附上博文链接!

PostgreSQL数据库pg_dump命令行不输入密码的方法

对于PostgreSQL数据库的备份按照官方手册的方法之一就是采用“SQL Dump”的方式(另一种方式是直接备份文件系统中的文件,可参考官方手册)。

基本用法如下:

pg_dump dbname > outfile

首先,正如命令行所展示的,pg_dump是将命令结果输出到标准输出中。

其次,pg_dump并不影响数据库工作过程中的其他操作(主要是关心pg_dump会不会产生读写锁(read lock、write lock)),但也有例外,那就是哪些需要使用互斥锁(exclusive lock)的操作,如ALTER TABLE。

由于对于运维而言,通常需要使用脚本来执行数据库备份,而不是每天手动执行命令行并输入密码备份,因此特地查了一下文档,根据文档“31.15. The Password File”节的说明,可以在用户目录下建一个配置文件,提前将密码写入这个配置文件中,配置文件的格式如下:

hostname:port:database:username:password

需要将此文件放在执行pg_dump命令的用户目录下,保存成.pgpass 文件,并且权限为600,否则PostgreSQL就会报

WARNING: password file "/root/.pgpass" has group or world access; permissions should be u=rw (0600) or less

注意:如果PostgreSQL数据库的数据库表结构(database schema)依赖OIDs(例如外键),则pg_dump需要加-o选项。

PostgreSQL数据库的导出速度还是比较快的,导出3万多行不到1s。

PostgreSQL导出数据库命令行实例:

pg_dump -U confluence -d confluence -h 127.0.0.1 -o >/tmp/tmp_confluence_postgresql.sql

其中,

-U表示执行用户

-d表示数据库

-h表示主机

-o表示支持OLDs

注:如果不想使用.pgpass 文件,则可以在命令行中添加-W选项,意思是输入密码再执行。

附录:PostgreSQL数据库一些适合运维的基本操作

登录PostgreSQL数据库:

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

如果也不想输入密码,则可以执行:

psql "host=127.0.0.1 hostaddr=127.0.0.1 port=5432 user=yourloginname password=yoursecret"

列出数据库:

\l

退出数据库console:

\q

tag:PostgreSQL数据库备份,PostgreSQL命令行不输入密码,PostgreSQL数据库基本操作,PostgreSQL数据库导出,PostgreSQL运维教程

--end--

pg_dump: [archiver (db)] connection to database “dbase” failed: FATAL: Peer authentication failed for user “postgres”

pg_dump: [archiver (db)] connection to database “dbase” failed: FATAL: Peer authentication failed for user “postgres”
"Peer authentication" means that it's comparing your database username against your Linux username. It should work if you're logged in as postgres. You probably don't want to hit that md5 rule in pg_hba, as the postgres database user generally doesn't have a password. –

 

The Problem you have is, that if u dont define the Host, your system will decide.

explicit add "-h localhost", this will fix it

猜你喜欢

转载自blog.csdn.net/cdnight/article/details/90638328