pg_restore: [directory archiver] could not open input file "xxx/xxx.dat": Value too large for defined data type
最近将本地的一个数据库搬到 VPS 上,在导入时出现了一个”Value too large for defined data type“的错误。通过 Google 搜索后发现没有实际的解决方案,但大致了解了下(http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#Value-too-large-for-defined-data-type)出错的原因,可能是因为 VPS 的系统是 32bit,而其中需要导入的一个 xxx.dat.gz 文件的太大导致的。
由于在本地使用 pg_dump -Fd
来导出,该选项导出为文件夹,其中数据库的每个表的数据为一个经过 gzip 压缩的文件,后缀为 .dat.gz。该导出方式不能直接通过 psql
来导出,而需要使用 pg_restore
来导入。
由于数据库文件太大,而本地上传到 VPS 的带宽太小了,如果要重新导出为 plain text 格式再上传比较麻烦。于是想了下发现错误的原因,可能在于 pg_restore
导入时,需要对 gzip 文件进行解压操作,而由于受系统(32bit)的限制而造成的。
那能不能在外面使用先解压出来,而 pg_restore
又支持导入已解压的文件(根据它可以直接读取 toc.dat 文件推测的)呢?
根据这个猜测,先尝试下使用系统自带的 gnuzip
对其进行解压,然后再将解压出来的文件替换原来未解压的文件。
经过测试,发现可以正常解压出来,并且 pg_restore
也可以识别(支持)解压出来的文件。