我写了一个脚本来REINDEX
索引数据库中的索引。这是其中之一:
echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
问题是我无法在独立模式下运行此脚本。psql
每次运行都提示输入密码。还有两个限制:
我无法在没有密码的数据库上创建用户。
因为REINDEX
锁表,我应该sleep <num>
在每个REINDEX
.
有没有自动解决方案?
n_live_tup
and n_dead_tup
in pg_stat_user_tables
or是什么意思pgstattuple
?
我对 PostgreSQL 中的表空间感到困惑。是不是类似于 LVM?我的意思是当磁盘已满时,我们可以添加另一个磁盘,然后格式化CREATE TABLESPACE tblspace LOCATION /media/disk2/data
吗?够了吗?或者我们应该手动使用ALTER
数据库、表或索引来利用它?
fsync
和 和有synchronous_commit
什么区别?我阅读了文档,我唯一理解的是他们都试图将更新物理写入磁盘。
我想在 bash 中使用 psql 返回的值。这是脚本:
psql "connection parameters" -c "SELECT pg_database_size('dbname');"
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
pg_database_size
------------------
5773072
(1 row)
Run Code Online (Sandbox Code Playgroud)
但我只想要这样5773072
我就可以在日志记录中使用它。有人可以帮忙吗?
我写了一个脚本来备份 postgresql COPY
,然后删除这些记录。pg_relation_size
删除前后我都用过。
但两者都pg_relation_size
显示相同的结果。这是否意味着VACUUM ANALYZE
没有帮助?