在 Debian 或其它 Linux 系统上,为数据库创建一个单独的挂载点(如 /opt/pgdata
)并将一块大容量硬盘挂载到这个目录有几个优点:数据隔离、性能优化、备份和恢复、安全性。
因此接上篇 “【PostgreSQL】- 1.1 在 Debian 12 上安装 PostgreSQL 15”,我在初始化之前先规划数据库的存储。
添加硬盘
新添加一块大容量硬盘,规划做为数据库的数据盘。
查看新硬盘
~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 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 - root
Password:
~# fdisk /dev/vdb
Welcome 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 gpt
Information: You may need to update /etc/fstab.
继续创建分区:
~# parted /dev/vdb mkpart primary 0% 100%
Information: You may need to update /etc/fstab.
这将在整个磁盘上创建一个主分区。
查看创建结果如下:
~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 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/vdb1
Physical volume "/dev/vdb1" successfully created.
创建卷组(VG)
~# vgcreate vg_pgdata /dev/vdb1
Volume group "vg_pgdata" successfully created
创建逻辑卷(LV)
~# lvcreate -L 2T -n lv_pgdata vg_pgdata
Volume group "vg_pgdata" has insufficient free space (524287 extents): 524288 required.
检查一下:
~# vgdisplay vg_pgdata
--- Volume group ---
VG Name vg_pgdata
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <2.00 TiB
PE Size 4.00 MiB
Total PE 524287
Alloc PE / Size 0 / 0
Free PE / Size 524287 / <2.00 TiB
VG 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_pgdata
Logical volume "lv_pgdata" created.
确认一下
~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_pgdata vg_pgdata -wi-a----- <2.00t
root zh-ubds-pg01-hw8-deb12-zx-ser-vg -wi-ao---- 98.56g
swap_1 zh-ubds-pg01-hw8-deb12-zx-ser-vg -wi-ao---- 980.00m
创建文件系统
~# mkfs.ext4 /dev/vg_pgdata/lv_pgdata
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 536869888 4k blocks and 134217728 inodes
Filesystem UUID: f43e19a0-3d29-441b-bd47-b97dadd97b3c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information:
done
挂载新分区:
~# mkdir /opt/pgdata
~# mount /dev/vg_pgdata/lv_pgdata /opt/pgdata
检查
~# df -lh
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 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/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda1 455M 59M 372M 14% /boot
tmpfs 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 -lh
Filesystem Size Used Avail Use% Mounted on
udev 7.8G 0 7.8G 0% /dev
tmpfs 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/shm
tmpfs 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/pgdata
tmpfs 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 /opt
total 4
drwx------ 3 postgres postgres 4096 Mar 27 11:27 pgdata