PostgreSQL Windows\Linux\FreeBSD的数据文件通用吗
发布日期:2021-10-27 09:30:38 浏览次数:2 分类:技术文章

本文共 6786 字,大约阅读时间需要 22 分钟。

标签

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软件

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

解压到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软件

参考

解压数据

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,达到兼容。(比如动态内存分配策略,预加载动态库的位置等)

转载地址:https://blog.csdn.net/weixin_34391445/article/details/90594864 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据结构实践项目——外部排序
下一篇:数据挖掘—数据挖掘的商业应用

发表评论

最新留言

不错!
[***.144.177.141]2024年04月19日 00时38分08秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章