Debian11にPostgres15をインストールし、nfsしてマウントしたHDDにバックアップをとる方法

Linux

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

NTP設定

何しろDebianインストールしたら一番最初に行ってます。時刻がずれると、ログとか見るのも苦労するし。

編集するファイル

/etc/systemd/timesyncd.conf

[Time]
NTP=ntp.nict.jp

リスタート

systemctl restart systemd-timesyncd

同期できているか確認する

# systemctl -l status systemd-timesyncd
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-04-29 15:23:24 JST; 19s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 4629 (systemd-timesyn)
     Status: "Initial synchronization to time server 61.205.120.130:123 (ntp.nict.jp)."
      Tasks: 2 (limit: 28637)
     Memory: 1004.0K
        CPU: 40ms
     CGroup: /system.slice/systemd-timesyncd.service
             mq4629 /lib/systemd/systemd-timesyncd

 4月 29 15:23:24 testdb systemd[1]: Starting Network Time Synchronization...
 4月 29 15:23:24 testdb systemd[1]: Started Network Time Synchronization.
 4月 29 15:23:24 testdb systemd-timesyncd[4629]: Initial synchronization to time server 61.205.120.130:123 (ntp.nict.jp).

Postgres15は入らない

Debian11をインストールし標準のapt.source管理できるPostgresは13になります。

そこで、リポジトリを追加し、Postgres15をapt管理でインストールできるようにします。サポート期間を少しでも長くしたいからです。結構、サーバ変更には労力を使いますので。

リポジトリ追加手順

apt-get install wget curl gnupg2 -y
sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update

これでリポジトリの準備完了です。postgres15をインストールします。

apt-get install postgresql-15

postgres15の設定ファイルの場所はここ

root@testdb:/etc/postgresql/15/main# ls
conf.d  environment  pg_ctl.conf  pg_hba.conf  pg_ident.conf  postgresql.conf  start.conf

今回は、設定面倒なので、今動いているPostgresからコンフィグ取ってきて入替

postgresql.confはこんな感じ

max_connections = 400
shared_buffers = 8GB
effective_cache_size = 8GB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 4
effective_io_concurrency = 2
work_mem = 10485kB
min_wal_size = 2GB
max_wal_size = 4GB

初期パスワード変更のため、pg_hba.confiに一度以下を追記

host    all             all             192.168.0.0/24          trust

postgres15をリスタート

# /etc/init.d/postgresql restart
Restarting postgresql (via systemctl): postgresql.service.

すると、PgAdmin4からアクセス可能になります

パスワードを設定したい場合

Linuxユーザにもpostgresユーザは作成されているのでパスワードをつける

# passwd postgres
新しい パスワード:
新しい パスワードを再入力してください:
passwd: パスワードは正しく更新されました

postgresユーザで入りなおす

# su - postgres
postgres@test-postgres:~$

PostgreSQL内のpostgresユーザのパスワード変更する

postgres@test-postgres:~$ psql
psql (13.9 (Debian 13.9-0+deb11u1))
"help"でヘルプを表示します。

postgres=# alter role postgres with password 'passwd';
ALTER ROLE

これで、pg_hba.confをtrust → md5に変更すると、LAN内からのアクセスにパスワードが聞かれるようになる。

host    all             all             192.168.0.0/24          md5

postgresql再起動

# /etc/init.d/postgresql restart
Restarting postgresql (via systemctl): postgresql.service.

LAN内クライアントのpgAdmin4からアクセスしてみるとパスワードを聞かれるようになる。

PostgresDBリストアのコツ

まずはユーザからリストアする

PgAdminでやるとなぜか失敗する(やり方がわかってない?)ので、コマンドでやる

#su postgres
$ /usr/lib/postgresql/15/bin/psql -p 5432 template1 < 2023-01-13.group

その後他のdbをpgadminでリストアしていく

新しいHDDを買ってきて増設します

接続したら、dmesgで確認

debianがインストールしてあるのはsda の480GB。これはマイクロンの高信頼性SSDです。

新しく購入したのは東芝のエンタープライズ向けHDD 4TBで、sdbで認識しているのが分かります。

[    1.828100] sd 0:0:0:0: [sda] 937703088 512-byte logical blocks: (480 GB/447 GiB)
[    1.828105] sd 0:0:0:0: [sda] 4096-byte physical blocks
[    1.828124] sd 0:0:0:0: [sda] Write Protect is off
[    1.828127] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
[    1.828157] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    1.828379] sd 1:0:0:0: [sdb] 7814037168 512-byte logical blocks: (4.00 TB/3.64 TiB)
[    1.828384] sd 1:0:0:0: [sdb] 4096-byte physical blocks
[    1.828398] sd 1:0:0:0: [sdb] Write Protect is off
[    1.828402] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[    1.828424] sd 1:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA

本当に買ってきたばかりだったらパーティショニングする必要があります。こちらをご参考に。

実は、他のサーバで利用してパーティショニングもフォーマットも終わっており、マウントしたいパーティションはsdb1で認識している事を確認

[    1.884023]  sdb: sdb1

マウントポイントの作成

# mkdir /mnt/backup

マウントする

mount -t ext4 /dev/sdb1 /mnt/backup/

マウントできたかを確認

# df -lh
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev              12G     0   12G    0% /dev
tmpfs            2.4G  620K  2.4G    1% /run
/dev/sda2        438G  1.8G  414G    1% /
tmpfs             12G  1.1M   12G    1% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
/dev/sda1        511M  5.8M  506M    2% /boot/efi
tmpfs            2.4G     0  2.4G    0% /run/user/0
tmpfs            2.4G     0  2.4G    0% /run/user/1000
/dev/sdb1        3.6T  2.4T  1.1T   71% /mnt/backup

起動時マウントできるよに調整 fstabにマウント情報を書き込む

vi /etc/fstab

/dev/sdb1       /mnt/backup     ext4    errors=remount-ro       0       0

umount,mountコマンドでsdb1がマウントされている事を確認

# umount /mnt/backup/
root@testdb:/etc/postgresql/15/main# df -lh
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev              12G     0   12G    0% /dev
tmpfs            2.4G  620K  2.4G    1% /run
/dev/sda2        438G  1.8G  414G    1% /
tmpfs             12G  1.1M   12G    1% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
/dev/sda1        511M  5.8M  506M    2% /boot/efi
tmpfs            2.4G     0  2.4G    0% /run/user/0
tmpfs            2.4G     0  2.4G    0% /run/user/1000
root@testdb:/etc/postgresql/15/main# mount /mnt/backup/
root@testdb:/etc/postgresql/15/main# ls /mnt/backup/
db/         etc/        log/        lost+found/
root@testdb:/etc/postgresql/15/main# df -lh
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev              12G     0   12G    0% /dev
tmpfs            2.4G  620K  2.4G    1% /run
/dev/sda2        438G  1.8G  414G    1% /
tmpfs             12G  1.1M   12G    1% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
/dev/sda1        511M  5.8M  506M    2% /boot/efi
tmpfs            2.4G     0  2.4G    0% /run/user/0
tmpfs            2.4G     0  2.4G    0% /run/user/1000
/dev/sdb1        3.6T  2.4T  1.1T   71% /mnt/backup

nfsでリモートにあるサーバのディスクをマウント

ホストサーバにnfs-kernel-serverをインストール

apt-get install nfs-kernel-server

クライアントマシンにnfsインストール

apt-get install nfs-common

データベースバックアップ用のマウントポイント作成

root@testdb:/home/postgres/mnt# mkdir pg_backup
root@testdb:/home/postgres/mnt# mkdir pg_log
root@testdb:/home/postgres/mnt# mkdir pg_exports

/etc/fstab へ nfsマウントポイントの登録

# 本番DBのバックアップフォルダをnfsでローカルのマウントポイントにマウント
192.168.0.11:/var/local/pgsql/backup /home/postgres/mnt/pg_backup nfs ro,rsize=8182
192.168.0.11:/var/local/pgsql/log /home/postgres/mnt/pg_log nfs ro,rsize=8182
192.168.0.11:/var/local/pgsql/reports /home/postgres/mnt/pg_reports nfs ro,rsize=8182

192.168.0.11サーバ(ホスト本番データベースサーバに設定)がnfsでマウントが出来るように許可

vi /etc/exports
/var/local/pgsql/backup 192.168.0.57/32(rw,sync,no_root_squash,wdelay,no_subtree_check)
/var/local/pgsql/log 192.168.0.57/32(rw,sync,no_root_squash,wdelay,no_subtree_check)
/var/local/pgsql/reports 192.168.0.57/32(rw,sync,no_root_squash,wdelay,no_subtree_check)
sudo exportfs -a

マウントしてみる

 # mount /home/postgres/mnt/pg_backup/
 # mount /home/postgres/mnt/pg_log/
 # mount /home/postgres/mnt/pg_reports/

本番サーバのデータが、/home/postgres/mnt の中で確認できればOK

mntの中のファイルを削除しようとしても削除できない事を確認(nfsでリモートのファイルを削除してしまわないようにしている)

rsyncでバックアップする

nfsでマウントしたリモートのバックアップフォルダを、ローカルにマウントしたディスクへバックアップする

rsyncのインストール

# apt-get install rsync

バックアップスクリプトの作成

# cat /usr/local/sbin/transfer.sh
#!/bin/sh
rsync -au /home/postgres/mnt/pg_backup/ /mnt/backup/db/
rsync -au /home/postgres/mnt/pg_log/ /mnt/backup/log/

rsync -avz -C --delete /etc/ /mnt/backup/etc/

#古いバックアップデータを削除
TMDAY1=`date -d '900 days ago' +%Y-%m-%d`
rm /mnt/backup/db/$TMDAY1*
rm /mnt/backup/log/postgresql-$TMDAY1*

chown -R postgres:sambashare /mnt/backup
chmod -R 774 /mnt/backup

新しいバックアップファイルがコピーされている事を確認

昨日のバックアップファイルがちゃんとできている。

cat postgresql-2023-04-30

ファイルの中身もOK

rsyncで /mnt/backup にコピーしたdbのバックアップファイルをPgAdminでリストアしてみて、スキーマが全部戻っている事を確認。また、1つのテーブルでユーザ権限がちゃんと戻っている事を確認

sambaのインストール

# apt-get install samba

ユーザ作成スクリプト

 cat smbuser_add.sh
#!/bin/sh
awk 'BEGIN {FS=":"} {printf("%s %s %s\n",$1,$2,$3)}'|while read acc pas gr
do
        useradd -g ${gr} ${acc}
        printf "${pas}\n${pas}\n"|passwd ${acc}
        printf "${pas}\n${pas}\n"|smbpasswd -sa ${acc}
done

予め、addruser でlinuxのユーザは作成しておいて、それと同じユーザ名でsambaのユーザアカウントを作成する

smbuser ファイルにユーザ一覧を作成

ユーザ名:パスワード:グループ

# cat smbuser | ./smbuser_add.sh
./smbuser_add.sh: 4: useradd: not found
新しい パスワード:新しい パスワードを再入力してください:passwd: パスワードは正しく更新されました
./smbuser_add.sh: 4: useradd: not found
新しい パスワード:新しい パスワードを再入力してください:passwd: パスワードは正しく更新されました
./smbuser_add.sh: 4: useradd: not found
新しい パスワード:新しい パスワードを再入力してください:passwd: パスワードは正しく更新されました

グループにはsambashareを割りて

vi /etc/group

にて、sambashare:ユーザ名1,ユーザ名2

という形でグループにわりあてる。後は、smbでアクセスさせたいディレクトに

chgrp -R sambashare *

でグループ権限割り当て

samb.conf

[global]
        dos charset = CP932
        server string = %h server
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully*
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        wins server = 192.168.0.11
        wins support = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap config * : range =
        idmap config * : backend = tdb
        acl group control = Yes
        create mask = 0770
        #security mask = 0770
        directory mask = 0770
        #directory security mask = 0770
        store dos attributes = no
        dfree cache time = 60
        hide unreadable = yes

[DB]
        path = /mnt/backup/db
        valid users = user
        comment = DatabaseData BackupFolder
        read list = user
        read only = Yes

\\192.168.0.? という形式でWindowsクライアントからアクセスし、すぐに応答がある事を確認。

再起動後プロセスが実行されているか

sdb がマウントされている

sambaが有効になっていてWindowsからすぐアクセス可能

dbが起動しており、PgAdminからアクセス可能

nfsでのマウントが失敗してる

再起動後自動的にnfsマウントされない事が判明

Apr 30 11:04:09 testdb mount[468]: mount.nfs: Network is unreachable
Apr 30 11:04:09 testdb mount[465]: mount.nfs: Network is unreachable
Apr 30 11:04:09 testdb mount[467]: mount.nfs: Network is unreachable

起動時になぜか、Network is unreachableで接続できていない

起動後安定してから mountコマンドで手動でマウントするとマウントできる。

bgコマンドを付与

マウントが失敗したときの再試行の方法を選択するオプションです。-bg オプションの場合はバックグラウンドでマウントが試みられます。

ro,bg,retry=10,rsize=8182

とオプションを加えたけど解決せず

テスト環境なのでDHCPで構成していたのがいけなかったのだと思います。固定IPを振ったらすんなりマウントできました。タイミングの問題ですね。nicがDHCPでIP取得してそのまま通信できるようになるより先に、nfsの起動時マウントが走ってしまうみたい。

固定IPにするとこの問題おきませんでした。

Apr 30 11:50:36 testdb systemd[1]: Mounting /home/postgres/mnt/pg_backup...
Apr 30 11:50:36 testdb systemd[1]: Mounting /home/postgres/mnt/pg_log...
Apr 30 11:50:36 testdb systemd[1]: Mounting /home/postgres/mnt/pg_reports...

DHCPでもマウントできるといいかなとも思いますが、時間かけるのもあれなんで、とりあえず固定IP運用する予定でしたのでそのままにしました。

タイトルとURLをコピーしました