我们已经转移到Google Cloud SQL,创建了几个数据库并导入了大量数据。除此之外,还有大量的查询被中断,留下了一些临时文件形式的垃圾。存储使用量远远超过1TB。
postgres=> SELECT datname, temp_files AS "Temporary files", pg_size_pretty(temp_bytes) AS "Size of temporary files" FROM pg_stat_database;
datname | Temporary files | Size of temporary files
---------------+-----------------+-------------------------
cloudsqladmin | 0 | 0 bytes
template0 | 0 | 0 bytes
postgres | 0 | 0 bytes
template1 | 0 | 0 bytes
first | 33621 | 722 GB
second | 9 | 3399 MB
third | 293313 | 153 GB
(7 rows)
根据上面的查询结果,我们有大约1TB的潜在无用文件。有几个问题:
- 如何识别未被任何正在运行的查询使用的临时文件
- 如何删除由Google Cloud SQL管理的postgres
根据PostgreSQL文档,字段temp_bytes
定义为:
此中的查询写入临时文件的数据总量数据库无论为什么临时文件已创建,并且与log_temp_files无关背景
意思是,该数字是自创建数据库以来(或自上次pg_stat_reset((以来(临时文件大小的总和,而不是当前临时文件使用情况。
当前用法可以使用非云数据库实例中的"文件函数"来确定,但在云SQL中,普通用户不能执行select pg_ls_dir('base/pgsql_temp')
,因为这只留给超级用户。
正如您所说,Cloud SQL是一个托管服务,因此目前无法查看当前临时文件的使用情况。
有一件事肯定会澄清你看到的数字,那就是pg_stat_reset((,尽管如前所述,它不是关于当前临时文件的使用情况,而是一个历史总数;
确保清除临时文件的一件事是重新启动数据库实例,因为启动过程的一部分是擦除base/pgsql_temp
目录。