在 Debian 或其它 Linux 系统上,为数据库创建一个单独的挂载点(如 /opt/pgdata
)并将一块大容量硬盘挂载到这个目录有几个优点:数据隔离、性能优化、备份和恢复、安全性。
因此接上篇 “【PostgreSQL】- 1.1 在 Debian 12 上安装 PostgreSQL 15”,我在初始化之前先规划数据库的存储。
添加硬盘
新添加一块大容量硬盘,规划做为数据库的数据盘。
查看新硬盘
~# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsr0 11:0 1 1024M 0 romvda 254:0 0 100G 0 disk|-vda1 254:1 0 487M 0 part /boot|-vda2 254:2 0 1K 0 part`-vda5 254:5 0 99.5G 0 part|-deb12ser--vg-root 253:0 0 98.6G 0 lvm /`-deb12ser--vg-swap_1 253:1 0 980M 0 lvm [SWAP]vdb 254:16 0 2T 0 disk
硬盘分区
找到新硬盘 vdb
, 使用 fdisk
进行分区
~# su - rootPassword:~# fdisk /dev/vdbWelcome to fdisk (util-linux 2.38.1).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Device does not contain a recognized partition table.The size of this disk is 2 TiB (2199023255552 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).Created a new DOS (MBR) disklabel with disk identifier 0x7f500dd1.Command (m for help):
看到提示硬盘vdb
大小超过了2TB,建议使用GUID分区表格式(GPT)而不是DOS分区表格式(MBR)。MBR格式对于大于2TB的驱动器有限制,而GPT则没有这个限制。
这里换用parted
来创建GPT分区。不过,如果您确定要使用fdisk
并且您的fdisk
版本支持GPT,您可以尝试以下步骤(但请注意,fdisk
的GPT支持可能因Linux发行版而异):
退出当前的fdisk
会话(如果没有做任何更改的话):
Command (m for help): q
使用parted
来创建GPT分区(推荐,应为fdisk
需要用专家模式或者通过直接写入GPT头来强制fdisk
使用GPT分区表,通常不推荐,因为它可能会导致数据丢失或分区表损坏。):
debian12 默认没有 parted
,进行安装:apt install parted
,然后进行 gpt
类型的分区:
~# parted /dev/vdb mklabel gptInformation: You may need to update /etc/fstab.
继续创建分区:
~# parted /dev/vdb mkpart primary 0% 100%Information: You may need to update /etc/fstab.
这将在整个磁盘上创建一个主分区。
查看创建结果如下:
~# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsr0 11:0 1 1024M 0 romvda 254:0 0 100G 0 disk|-vda1 254:1 0 487M 0 part /boot|-vda2 254:2 0 1K 0 part`-vda5 254:5 0 99.5G 0 part|-deb12ser--vg-root 253:0 0 98.6G 0 lvm /`-deb12ser--vg-swap_1 253:1 0 980M 0 lvm [SWAP]vdb 254:16 0 2T 0 disk`-vdb1 254:17 0 2T 0 part
配置 LVM
创建物理卷(PV)
~# pvcreate /dev/vdb1Physical volume "/dev/vdb1" successfully created.
创建卷组(VG)
~# vgcreate vg_pgdata /dev/vdb1Volume group "vg_pgdata" successfully created
创建逻辑卷(LV)
~# lvcreate -L 2T -n lv_pgdata vg_pgdataVolume group "vg_pgdata" has insufficient free space (524287 extents): 524288 required.
检查一下:
~# vgdisplay vg_pgdata--- Volume group ---VG Name vg_pgdataSystem IDFormat lvm2Metadata Areas 1Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 1Act PV 1VG Size <2.00 TiBPE Size 4.00 MiBTotal PE 524287Alloc PE / Size 0 / 0Free PE / Size 524287 / <2.00 TiBVG UUID RzUB4Z-eiNi-UEoX-9634-8CmF-VnKT-hVWEzd
错误信息表明,尽管 vg_pgdata
卷组显示的空闲空间接近 2TB(由 524287 个空闲的 PE 组成,每个 PE 大小为 4MiB),但实际上它没有足够的空间来创建一个精确的 2TB(2 * 1024 * 1024 MiB)逻辑卷,因为 2TB 需要 524288 个 PE。
那么换个参数配置
~# lvcreate -l 100%FREE -n lv_pgdata vg_pgdataLogical volume "lv_pgdata" created.
确认一下
~# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convertlv_pgdata vg_pgdata -wi-a----- <2.00troot zh-ubds-pg01-hw8-deb12-zx-ser-vg -wi-ao---- 98.56gswap_1 zh-ubds-pg01-hw8-deb12-zx-ser-vg -wi-ao---- 980.00m
创建文件系统
~# mkfs.ext4 /dev/vg_pgdata/lv_pgdatamke2fs 1.47.0 (5-Feb-2023)Discarding device blocks: doneCreating filesystem with 536869888 4k blocks and 134217728 inodesFilesystem UUID: f43e19a0-3d29-441b-bd47-b97dadd97b3cSuperblock backups stored on blocks:32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,102400000, 214990848, 512000000Allocating group tables: doneWriting inode tables: doneCreating journal (262144 blocks): doneWriting superblocks and filesystem accounting information:done
挂载新分区:
~# mkdir /opt/pgdata~# mount /dev/vg_pgdata/lv_pgdata /opt/pgdata
检查
~# df -lhFilesystem Size Used Avail Use% Mounted onudev 7.8G 0 7.8G 0% /devtmpfs 1.6G 648K 1.6G 1% /run/dev/mapper/deb12ser--vg-root 97G 1.6G 90G 2% /tmpfs 7.8G 0 7.8G 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/lock/dev/vda1 455M 59M 372M 14% /boottmpfs 1.6G 0 1.6G 0% /run/user/1000/dev/mapper/vg_pgdata-lv_pgdata 2.0T 28K 1.9T 1% /opt/pgdata
配置自动挂载:
要确保每次启动时分区都自动挂载,编辑/etc/fstab
文件并添加一行类似于以下的条目:
/dev/vg_pgdata/lv_pgdata /opt/pgdata ext4 defaults 0 0
重启检查 reboot
~# df -lhFilesystem Size Used Avail Use% Mounted onudev 7.8G 0 7.8G 0% /devtmpfs 1.6G 640K 1.6G 1% /run/dev/mapper/zh--ubds--pg01--hw8--deb12--zx--ser--vg-root 97G 1.6G 90G 2% /tmpfs 7.8G 0 7.8G 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/lock/dev/vda1 455M 59M 372M 14% /boot/dev/mapper/vg_pgdata-lv_pgdata 2.0T 28K 1.9T 1% /opt/pgdatatmpfs 1.6G 0 1.6G 0% /run/user/1000
配置权限
确定 PostgreSQL 的用户和组(这里是 postgres 用户和组)。
更改 /opt/pgdata 目录的所有者和组为 PostgreSQL 的用户和组。使用 chown 命令:
~# chown -R postgres:postgres /opt/pgdata
确保目录的权限设置得当,以便 PostgreSQL 进程可以读写数据。
这里设置权限为 700(-rwx------ 仅所有者有读、写和执行权限):
~# chmod 700 /opt/pgdata
检查
~# ls -l /opttotal 4drwx------ 3 postgres postgres 4096 Mar 27 11:27 pgdata