Bar*_*rks 5 postgresql ubuntu vacuum azure
在启动日志条目中表明 autovacuum 不工作。我查询 pg_stat_user_tables 表并且 last_vacuum 和 last_autovacuum 列是空的,尽管我之前运行过真空查询。将 pgadmin 连接到数据库表明真空不工作。
我在两个 Ubuntu Azure VM 上使用 postgresql。一个VM设置为主,第二个是通过流式传输的复制数据库。在https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-on-postgresql-on-an-ubuntu-12-04-vps 中大致描述。
除了 autovacuum 之外,一切似乎都很有效。在启动过程中记录以下错误:
LOG: test message did not get through on socket for statistics collector
LOG: disabling statistics collector for lack of working socket
WARNING: autovacuum not started because of misconfiguration
HINT: Enable the "track_counts" option.
LOG: database system was shut down at 2017-01-19 14:07:13 UTC
DEBUG: checkpoint record is at 38/F6000028
Run Code Online (Sandbox Code Playgroud)
在 postgresql.config 我使用以下设置:
track_counts = on
autovacuum = on
log_autovacuum_min_duration = 200
autovacuum_max_workers = 1
autovacuum_naptime =960
autovacuum_vacuum_threshold = 128
autovacuum_analyze_threshold = 256
Run Code Online (Sandbox Code Playgroud)
对数据库的查询(从 pg_stat_user_tables 中选择 *)以查找最后一个(自动)真空为最后一个(自动)真空提供空列而不是日期时间。就在我运行 VACUUM FULL VERBOSE 之前;这给了我真空结果。
如果我查询真空设置:
select *
from pg_settings
where name like 'autovacuum%'
Run Code Online (Sandbox Code Playgroud)
这是结果:
"autovacuum";"on"<br />
"autovacuum_analyze_scale_factor";"0.1"
"autovacuum_analyze_threshold";"256"
"autovacuum_freeze_max_age";"200000000"
"autovacuum_max_workers";"1"<br />
"autovacuum_multixact_freeze_max_age";"400000000"
"autovacuum_naptime";"960"<br />
"autovacuum_vacuum_cost_delay";"20"
"autovacuum_vacuum_cost_limit";"-1"
"autovacuum_vacuum_scale_factor";"0.2"
"autovacuum_vacuum_threshold";"128"
"autovacuum_work_mem";"-1"
Run Code Online (Sandbox Code Playgroud)
这些是“track_”结果:
"track_activities";"on"
"track_activity_query_size";"1024"
"track_commit_timestamp";"off"
"track_counts";"off"
"track_functions";"none"
"track_io_timing";"off"
Run Code Online (Sandbox Code Playgroud)
pg_hba.conf(没有复制和网络/用户设置)看起来像这样:
local all all trust
host all all localhost trust
host all all 10.1.1.5/32 md5
host all all 127.0.0.1/32 md5
host all all 0.0.0.0 0.0.0.0 md5
Run Code Online (Sandbox Code Playgroud)
/etc/hosts:
127.0.0.1 localhost
127.0.1.1 ubuntu
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Run Code Online (Sandbox Code Playgroud)
这是'netstat -ant|grep 5432'的结果,如果清理和格式化的话。
User@Machine:/datadrive/log/postgresql/pg_log$ netstat -ant|grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
tcp 39 0 InternIpMaster:5432 InternIpSlave:36338 ESTABLISHED
tcp 0 0 InternIpMaster:5432 IpJob:63814 TIME_WAIT
tcp 0 0 InternIpMaster:5432 IpJob:22192 TIME_WAIT
tcp 0 0 InternIpMaster:5432 IpJob:47729 TIME_WAIT
tcp 0 0 InternIpMaster:5432 IpJob:55663 TIME_WAIT
tcp6 0 0 :::5432 :::* LISTEN
Run Code Online (Sandbox Code Playgroud)
我不认为 autovacuum 需要工作,因为
所以在启动期间 track_counts 在运行时被禁用。
我一直在寻找改变 iptables 的解决方案。如果没有任何 iptable 规则,它将无法工作。我已作为主机连接到 localhost。我已更改 Azure 中的防火墙设置。我打开 5432 以从所有 ip 访问 vm。我可以从其他系统访问数据库。我已将 conf 重置为默认值,仅更改了复制。我多次重新启动该服务。
我错过了什么?
我想详细说明答案@Daniel以及我的问题的解决方案。
我已经设置了 iptables 来访问 postgresql,如下所示:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -j DROP
Run Code Online (Sandbox Code Playgroud)
我以为这已经足够了。然而,当我使用并重新启动 postgres 服务器时,因缺少工作套接字而禁用统计收集器的sudo iptables --flush错误消失了。
我还使用iptraf来调查流量(sudo apt-get install iptraf sudo iptraf)。我注意到流量源自服务器的 ip 本地(子网)地址,但位于不同的端口。这是从属计算机上的流量(不含天蓝色流量)。
SubnetIpSlave:22
SubnetIpSlave:45622
SubnetIpSlave:44770
SubnetIpSlave:48948
SubnetIpMaster:5432
Run Code Online (Sandbox Code Playgroud)
我假设此流量被 iptables 阻止,因为它不通过环回。因此我清理了 iptables。这是结果:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
sudo iptables -A INPUT -s 10.1.1.0/24 -j ACCEPT
sudo iptables -A INPUT -j DROP
Run Code Online (Sandbox Code Playgroud)
我包括了子网。我认为这就是它起作用的原因,因为 SubnetIpSlave 和 SubnetIpMaster 都在这个范围内。我可能可以删除ESTABLISHED,RELATED规则。
日志看起来应该是:
2017-01-24 09:19:38 UTC [1482-1] LOG: database system was shut down in recovery at 2017-01-24 09:17:41 UTC
2017-01-24 09:19:38 UTC [1483-1] [unknown]@[unknown] LOG: incomplete startup packet
2017-01-24 09:19:38 UTC [1482-2] LOG: entering standby mode
2017-01-24 09:19:38 UTC [1482-3] DEBUG: checkpoint record is at 5D/F2042CA8
Run Code Online (Sandbox Code Playgroud)
我很开心 ;)
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |