PostgreSQL Windows\Linux\FreeBSD的数据文件通用吗

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介:

标签

PostgreSQL , Linux , Windows , 数据文件 , 存储格式


背景

PostgreSQL是一个跨平台的数据库,比如支持WindowS, AIX , linux , freebsd等。

同时也支持不同架构例如X86,ARM等。

对于相同架构,不同平台,是否能实现文件级别的平移,甚至物理的流复制搭建STANDBY呢?

理论上从数据库的存储层面来看,如果两个平台存储结构(比如堆表、索引、WAL日志,CLOG等)一致,是可以平移的。

比如Windows,Linux,都是x64的,那么能不能平移? - 答案是可行的,之前平移过freebsd和linux的。(位数必须一致,32和64可不行)

从PostgreSQL代码中,并未找到存储层面不一致的地方,大家可以搜一下#ifdef WIN之类的,通常与Linux的系统调用(比如共享内存段的分配,内部进程通信等)差异较多,但是数据库本身存储层面没有找到差异。

那么我们来验证一下将Windows中的数据文件,拷贝到Linux下面使用的场景。

安装Windows PostgreSQL软件

建议下载已经打包好的二进制。

https://www.enterprisedb.com/download-postgresql-binaries

https://www.enterprisedb.com/postgresql-962-binaries-win64?ls=Crossover&type=Crossover

解压到d:\pgsql

初始化数据库

C:\windows\system32>d:  

D:\>cd pgsql  

D:\pgsql>cd bin  

D:\pgsql\bin>initdb.exe -D d:\pgsql/data -E SQL_ASCII -U postgres --locale=C  
属于此数据库系统的文件宿主为用户 "dege.zzz".  
此用户也必须为服务器进程的宿主.  
数据库簇将使用本地化语言 "C"进行初始化.  
缺省的文本搜索配置将会被设置到"english"  

禁止为数据页生成校验和.  

创建目录 d:/pgsql/data ... 成功  
正在创建子目录 ... 成功  
选择默认最大联接数 (max_connections) ... 100  
选择默认共享缓冲区大小 (shared_buffers) ... 128MB  
选择动态共享内存实现 ......windows  
创建配置文件 ... 成功  
正在运行自举脚本 ...成功  
正在执行自举后初始化 ...成功  
同步数据到磁盘...成功  

警告:为本地连接启动了 "trust" 认证.  
你可以通过编辑 pg_hba.conf 更改或你下次  
行 initdb 时使用 -A或者--auth-local和--auth-host选项.  

成功。您现在可以用下面的命令开启数据库服务器:  

    "pg_ctl" -D "d:\pgsql/data" -l logfile start  

配置参数

d:\pgsql\data\postgresql.conf  

修改如下配置  

port = 1951  
log_destination = 'csvlog'  

logging_collector = on  

启动数据库

D:\pgsql\bin>pg_ctl.exe start -D "d:\pgsql\data"  
正在启动服务器进程  

D:\pgsql\bin>LOG:  redirecting log output to logging collector process  
HINT:  Future log output will appear in directory "pg_log".  

查看控制文件内容

D:\pgsql\bin>pg_controldata.exe "d:\pgsql\data"  
pg_control 版本:                      960  
Catalog 版本:                         201608131  
数据库系统标识符:                     6395009439800837980  
数据库簇状态:                         在运行中  
pg_control 最后修改:                  2017/3/8 14:25:08  
最新检查点位置:                       0/14EB8B0  
优先检查点位置:                       0/14EB618  
最新检查点的 REDO 位置:               0/14EB8B0  
最新检查点的重做日志文件: 000000010000000000000001  
最新检查点的 TimeLineID:              1  
最新检查点的PrevTimeLineID: 1  
最新检查点的full_page_writes: 开启  
最新检查点的NextXID:          0:542  
最新检查点的 NextOID:                 12402  
最新检查点的NextMultiXactId: 1  
最新检查点的NextMultiOffsetD: 0  
最新检查点的oldestXID:            535  
最新检查点的oldestXID所在的数据库:1  
最新检查点的oldestActiveXID:  0  
最新检查点的oldestMultiXid:  1  
最新检查点的oldestMulti所在的数据库:1  
最新检查点的oldestCommitTsXid:0  
最新检查点的newestCommitTsXid:0  
最新检查点的时间:                     2017/3/8 14:22:46  
不带日志的关系: 0/1使用虚假的LSN计数器  
最小恢复结束位置: 0/0  
最小恢复结束位置时间表: 0  
开始进行备份的点位置:                       0/0  
备份的最终位置:                  0/0  
需要终止备份的记录:        否  
wal_level设置:                    minimal  
wal_log_hints设置:        关闭  
max_connections设置:   100  
max_worker_processes设置:   8  
max_prepared_xacts设置:   0  
max_locks_per_xact设置:   64  
track_commit_timestamp设置:        关闭  
最大数据校准:     8  
数据库块大小:                         8192  
大关系的每段块数:                     131072  
WAL的块大小:    8192  
每一个 WAL 段字节数:                  16777216  
标识符的最大长度:                     64  
在索引中可允许使用最大的列数:    32  
TOAST区块的最大长度:                1996  
大对象区块的大小:         2048  
日期/时间 类型存储:                   64位整数  
正在传递Flloat4类型的参数:           由值  
正在传递Flloat8类型的参数:                   由值  
数据页校验和版本:  0  

连接数据库,写入测试数据

D:\pgsql\bin>psql.exe -h 127.0.0.1 -p 1951 -U postgres postgres  
psql (9.6.2)  
输入 "help" 来获取帮助信息.  

postgres=# create table test(id int primary key, info text, crt_time timestamp);  

CREATE TABLE  

postgres=# insert into test select generate_series(1,100000),md5(random()::text),clock_timestamp();  
INSERT 0 100000  

postgres=# checkpoint;  
CHECKPOINT  


postgres=# select sum(hashtext(test.*::Text)) from test;  
     sum  
--------------  
 210964261159  
(1 行记录)  

postgres=# \q  

停库、打包、发送到linux x64

D:\pgsql\bin>pg_ctl.exe stop -m fast -D "d:\pgsql\data"  
等待服务器进程关闭 .... 完成  
服务器进程已经关闭  

打包d:\pgsql\data  

发送到linux  

安装Linux PostgreSQL软件

参考

《PostgreSQL on Linux 最佳部署手册》

解压数据

unzip data.zip  

修改配置

vi data/postgresql.conf  

注释  
#dynamic_shared_memory_type = windows  

修改数据目录权限

chmod -R 700 data  

启动数据库

pg_ctl start -D ./data  

pg_controldata   
pg_control version number:            960  
Catalog version number:               201608131  
Database system identifier:           6376040558507154751  
Database cluster state:               shut down  
pg_control last modified:             Wed 08 Mar 2017 11:15:19 AM CST  
Latest checkpoint location:           3C/8B000028  
Prior checkpoint location:            3C/8AF86CA0  
Latest checkpoint's REDO location:    3C/8B000028  
Latest checkpoint's REDO WAL file:    000000010000003C0000008B  
Latest checkpoint's TimeLineID:       1  
Latest checkpoint's PrevTimeLineID:   1  
Latest checkpoint's full_page_writes: on  
Latest checkpoint's NextXID:          0:88072139  
Latest checkpoint's NextOID:          173243  
Latest checkpoint's NextMultiXactId:  1  
Latest checkpoint's NextMultiOffset:  0  
Latest checkpoint's oldestXID:        1668  
Latest checkpoint's oldestXID's DB:   1  
Latest checkpoint's oldestActiveXID:  0  
Latest checkpoint's oldestMultiXid:   1  
Latest checkpoint's oldestMulti's DB: 1  
Latest checkpoint's oldestCommitTsXid:0  
Latest checkpoint's newestCommitTsXid:0  
Time of latest checkpoint:            Wed 08 Mar 2017 11:15:18 AM CST  
Fake LSN counter for unlogged rels:   0/1  
Minimum recovery ending location:     0/0  
Min recovery ending loc's timeline:   0  
Backup start location:                0/0  
Backup end location:                  0/0  
End-of-backup record required:        no  
wal_level setting:                    replica  
wal_log_hints setting:                off  
max_connections setting:              5000  
max_worker_processes setting:         128  
max_prepared_xacts setting:           0  
max_locks_per_xact setting:           64  
track_commit_timestamp setting:       off  
Maximum data alignment:               8  
Database block size:                  8192  
Blocks per segment of large relation: 131072  
WAL block size:                       8192  
Bytes per WAL segment:                16777216  
Maximum length of identifiers:        64  
Maximum columns in an index:          32  
Maximum size of a TOAST chunk:        1996  
Size of a large-object chunk:         2048  
Date/time type storage:               64-bit integers  
Float4 argument passing:              by value  
Float8 argument passing:              by value  
Data page checksum version:           0  

验证数据是否正确

psql -h 127.0.0.1 -p 1951 -U postgres postgres  


postgres=# select sum(hashtext(test.*::Text)) from test;  
     sum        
--------------  
 210964261159  
(1 row)  

测试插入更新删除等。

postgres=# update test set info ='new';  
UPDATE 100000  
postgres=# create table test1(id int, info text, crt_time timestamp);  
CREATE TABLE  
postgres=# insert into test1 select * from test;  
INSERT 0 100000  

小结

1. 目前来看,PostgreSQL在不同平台下的存储结构是一致的,所以只要CPU架构一致,是可以实现跨平台的物理文件平移的。

2. 平移时,注意软件的编译项一致(比如数据块的大小等)。

3. 平移前,如果还安装了其他插件例如PostGIS,那么也必须在目标安装对应的插件。

4. 注意修改postgresql.conf,达到兼容。(比如动态内存分配策略,预加载动态库的位置等)

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
19天前
|
Linux Windows
Linux01---目录结构,Linux系统下只有一个最顶级的树/,Windows系统有盘符概念,而Linux系统没有盘符概念,整个系统都在/根目录下,Linux 系统写法 /user/local
Linux01---目录结构,Linux系统下只有一个最顶级的树/,Windows系统有盘符概念,而Linux系统没有盘符概念,整个系统都在/根目录下,Linux 系统写法 /user/local
|
4天前
|
Java Linux 应用服务中间件
Windows和Linux的最佳Web服务器
【7月更文挑战第20天】Windows和Linux的最佳Web服务器
16 3
|
10天前
|
Linux
linux如何抓包数据
请注意,tcpdump有很多选项可以用来定制抓包的过程,例如,你可以指定要抓取的数据包类型,数据包的大小,或者只抓取满足特定条件的数据包等。你可以查看tcpdump的手册页来获取更多信息。
10 2
|
1月前
|
监控 算法 Linux
探索Linux中的lz4命令:高效的数据压缩工具
**探索Linux中的LZ4工具:快速数据压缩。LZ4算法提供高速压缩与解压缩,适合实时数据处理。命令行工具如`lz4c`用于文件压缩(`lz4c file.txt compressed.lz4`)和解压缩(`lz4c -d compressed.lz4 decompressed.txt`)。特点是速度快、低内存占用,可选压缩级别。注意命令的实际形式取决于安装的实现,使用前应查阅文档。**
|
1月前
|
存储 算法 安全
探索Linux的md5sum命令:保障数据完整性的利器
`md5sum`是Linux下的命令行工具,用于计算文件的MD5哈希,确保数据完整性。通过比较哈希值,它可以检测文件是否在传输或存储中被更改。常用参数包括`-b`(二进制模式)、`-c`(校验文件)、`--tag`(创建校验和文件)和`--status`(仅返回校验状态)。尽管MD5因安全性问题不建议用于加密,但仍然用于快速校验。例如,`md5sum filename.txt`计算文件哈希,`md5sum -c checksums.txt`校验文件完整性。注意,应结合安全存储和备份策略使用。
|
26天前
|
算法 Linux 数据处理
Linux命令ptx:数据索引利器
**Linux的ptx命令是文本索引工具,用于读取英文文本并创建排序索引。它支持关键字搜索、排序,并可定制输出。例如,提取`example.txt`的关键词(参照`keywords.txt`)并按字母顺序排序至`index.txt`:`ptx -o keywords.txt example.txt > index.txt`。使用时注意文件编码、参数选择,可与其他命令结合使用,并优化处理大量数据时的性能。是数据分析的好帮手。**
|
26天前
|
Linux 数据安全/隐私保护 Windows
pscp 将Linux服务器上的文件同步到Windows服务器上
【6月更文挑战第28天】pscp 将Linux服务器上的文件同步到Windows服务器上
40 0
|
26天前
|
Linux 数据库
Linux安装达梦数据库达梦数据
Linux安装达梦数据库达梦数据
32 0
|
27天前
|
Linux 数据处理
Linux中的pr命令:数据格式化与打印的艺术
`pr`命令是Linux下用于文本格式化的工具,擅长分页、设置页眉页脚及列宽,方便打印和阅读。它可以处理文件、管道输入,常用参数如 `-h` 设定页眉,`-t` 设置页脚,`-l` 控制每页行数,`-w` 设置列宽。例如,`pr -h "标题" -t "页码:%d" -l 2 file.txt` 可以将文本文件格式化并添加定制的页眉页脚。结合其他命令使用能增强文本处理能力。记得测试输出,了解详细帮助可查阅`man pr`。
|
27天前
|
运维 网络协议 Linux
Linux与Windows下追踪网络路由:traceroute、tracepath与tracert命令详解
Linux与Windows下追踪网络路由:traceroute、tracepath与tracert命令详解
43 0