Clickhouse备份恢复_clickhouse-client方式backup_restore命令备份恢复的使用介绍

本文主要是介绍Clickhouse备份恢复_clickhouse-client方式backup_restore命令备份恢复的使用介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Clickhouse备份恢复也可以使用clickhouse-client的backup和restore命令,参见https://clickhouse.com/docs/en/operations/backup#command-summary

clickhouse-client的backup命令备份出来的备份包的内容和开源工具clichouse-backup备份出来的备份包的内容类似,应该都是物理备份。clickhouse-client的backup命令备份出来的备份包,也可以拿到异机进行恢复,直接把备份包放到异机配置的system.disks备份目录下面后,再在异机下面直接执行restore database dbname from Disk(‘backupdirname’, ‘backupfilename’)命令就可以正常恢复了。oracle异机恢复如果异机和备份源机器目录一致的话可以顺利的按顺序执行restore spfile和restore controlfile和restore database,oracle异机恢复如果异机和备份源机器目录不一致则需要执行catalog backuppiece和newname for datafile 1 to ’ /datafile/system01.dbf’这种,但是clickhouse-client的异机恢复不需要像oracle一样执行catalog backuppiece。

备份实验
在服务器FStachDEV2上做备份

[root@FStachDEV2 ~]# mkdir /backups/
[root@FStachDEV2 ~]# chmod 766 /backups/
[root@FStachDEV2 ~]# vim /etc/clickhouse-server/config.d/backup_disk.xml
<clickhouse><storage_configuration><disks><backups><type>local</type><path>/backups/</path></backups></disks></storage_configuration><backups><allowed_disk>backups</allowed_disk><allowed_path>/backups/</allowed_path></backups>
</clickhouse>[root@FStachDEV2 ~]# systemctl restart clickhouse-server.service
[root@FStachDEV2 ~]# clickhouse-clientFStachDEV2 :) select name,path,type from system.disks;┌─name────┬─path─────────────────────┬─type──┐
1. │ backups │ /backups/Local2.default/chdata/clickhouse/data/Local │└─────────┴──────────────────────────┴───────┘FStachDEV2 :) create database lukestest1;FStachDEV2 :) CREATE TABLE lukestest1.table_mergetree (id String,create_time datetime) ENGINE = MergeTree() ORDER BY id;
FStachDEV2 :) insert into lukestest1.table_mergetree (id ,create_time) values ('1','2020-11-17'),('2','2020-11-17'),('3','2020-11-17'),('4','2020-11-17') ('5','2020-11-17'),('6','2020-11-17'),('7','2020-11-17'),('8','2020-11-17'),('9','2020-11-17'),('10','2020-11-17'),('11','2020-11-17'),('12','2020-11-17');FStachDEV2 :) CREATE TABLE lukestest1.table2_mergetree (id String,create_time datetime) ENGINE = MergeTree() ORDER BY id;
FStachDEV2 :) insert into lukestest1.table2_mergetree (id ,create_time) values ('1','2020-11-17'),('2','2020-11-17'),('3','2020-11-17'),('4','2020-11-17') ('5','2020-11-17'),('6','2020-11-17'),('7','2020-11-17'),('8','2020-11-17'),('9','2020-11-17'),('10','2020-11-17'),('11','2020-11-17'),('12','2020-11-17')FStachDEV2 :) backup database lukestest1 to Disk('backups', 'lukestest1.zip');┌─id───────────────────────────────────┬─status─────────┐
1. │ db2dba04-0b7a-473b-b88a-d8deee77b2cf │ BACKUP_CREATED │└──────────────────────────────────────┴────────────────┘FStachDEV2 :) SELECT id,name,base_backup_name,status,error,start_time,end_time FROM system.backups;┌─id───────────────────────────────────┬─name──────────────────────────────┬─base_backup_name─┬─status───┬─error─┬──────────start_time─┬────────────end_time─┐
1. │ d75ee6c1-8178-4e44-ae0c-6d64aeb79bb7 │ Disk('backups', 'lukestest1.zip') │                  │ RESTORED │       │ 2024-06-05 03:03:082024-06-05 03:03:08 │└──────────────────────────────────────┴───────────────────────────────────┴──────────────────┴──────────┴───────┴─────────────────────┴─────────────────────┘

解压备份包,查看备份目录和文件的信息

[root@FStachDEV2]# cd /backups/
[root@FStachDEV2 backups]# ll
-rw-r-----. 1 clickhouse clickhouse 4846 Jun  5 02:57 lukestest1.zip[root@FStachDEV2 backups]# unzip lukestest1.zip
Archive:  2.zipinflating: metadata/lukestest1.sqlinflating: metadata/lukestest1/table_mergetree.sqlinflating: metadata/lukestest1/table2_mergetree.sqlinflating: data/lukestest1/table2_mergetree/all_1_1_0/metadata_version.txtinflating: data/lukestest1/table2_mergetree/all_1_1_0/serialization.jsoninflating: data/lukestest1/table2_mergetree/all_1_1_0/default_compression_codec.txtinflating: data/lukestest1/table2_mergetree/all_1_1_0/count.txtinflating: data/lukestest1/table2_mergetree/all_1_1_0/columns.txtinflating: data/lukestest1/table2_mergetree/all_1_1_0/checksums.txtinflating: data/lukestest1/table2_mergetree/all_1_1_0/data.bininflating: data/lukestest1/table2_mergetree/all_1_1_0/data.cmrk3inflating: data/lukestest1/table2_mergetree/all_1_1_0/primary.cidxinflating: .backup[root@FStachDEV2 backups]# ll
drwxr-xr-x. 3 root       root         23 Jun  5 03:05 data
-rw-r-----. 1 clickhouse clickhouse 4846 Jun  5 02:57 lukestest1.zip
drwxr-xr-x. 3 root       root         44 Jun  5 03:05 metadata
[root@FStachDEV2 backups]# ll data
total 0
drwxr-xr-x. 3 root root 29 Jun  5 03:05 lukestest1
[root@FStachDEV2 backups]# ll data/lukestest1
total 0
drwxr-xr-x. 3 root root 22 Jun  5 03:05 table2_mergetree
[root@FStachDEV2 backups]# ll data/lukestest1/table2_mergetree
total 4
drwxr-xr-x. 2 root root 4096 Jun  5 03:05 all_1_1_0
[root@FStachDEV2 backups]# ll data/lukestest1/table2_mergetree/all_1_1_0
total 36
----------. 1 root root 259 Dec 31  1979 checksums.txt
----------. 1 root root  72 Dec 31  1979 columns.txt
----------. 1 root root   2 Dec 31  1979 count.txt
----------. 1 root root  93 Dec 31  1979 data.bin
----------. 1 root root  58 Dec 31  1979 data.cmrk3
----------. 1 root root  10 Dec 31  1979 default_compression_codec.txt
----------. 1 root root   1 Dec 31  1979 metadata_version.txt
----------. 1 root root  38 Dec 31  1979 primary.cidx
----------. 1 root root 158 Dec 31  1979 serialization.json
[root@FStachDEV2 backups]# ll metadata
total 4
drwxr-xr-x. 2 root root 59 Jun  5 03:05 lukestest1
----------. 1 root root 86 Dec 31  1979 lukestest1.sql
[root@FStachDEV2 backups]# ll metadata/lukestest1
total 8
----------. 1 root root 187 Dec 31  1979 table2_mergetree.sql
----------. 1 root root 186 Dec 31  1979 table_mergetree.sql

本机恢复实验,可以恢复
在服务器FStachDEV2上把数据库和表对应的文件改名,导致表无法查询,再恢复

FStachDEV2 :) select name,data_path,metadata_path from system.databases where name in ('lukestest1');┌─name───────┬─data_path──────────────────────┬─metadata_path───────────────────────────────────────────────────────────┐
1. │ lukestest1 │ /chdata/clickhouse/data/store//chdata/clickhouse/data/store/314/314036bc-c3de-4628-8f4b-435f9340da52/ │└────────────┴────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘FStachDEV2 :) select database,name,data_paths,metadata_path from system.tables where database in ('lukestest1') order by 1;┌─database───┬─name─────────────┬─data_paths──────────────────────────────────────────────────────────────────┬─metadata_path───────────────────────────────────────────────────────────────────────────────┐
1. │ lukestest1 │ table2_mergetree │ ['/chdata/clickhouse/data/store/858/858e6ec8-69f7-4a1b-852e-380f757939ca/']/chdata/clickhouse/data/store/314/314036bc-c3de-4628-8f4b-435f9340da52/table2_mergetree.sql2. │ lukestest1 │ table_mergetree  │ ['/chdata/clickhouse/data/store/667/66733022-fe6e-4753-9a11-9237f987f457/']/chdata/clickhouse/data/store/314/314036bc-c3de-4628-8f4b-435f9340da52/table_mergetree.sql  │└────────────┴──────────────────┴─────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────┘

进入数据库元数据目录/chdata/clickhouse/data/store/314/314036bc-c3de-4628-8f4b-435f9340da52/,把两表的元数据文件改名

[root@FStachDEV2 314]# cd  /chdata/clickhouse/data/store/314/314036bc-c3de-4628-8f4b-435f9340da52/
[root@FStachDEV2 314036bc-c3de-4628-8f4b-435f9340da52]# ll
total 8
-rw-r-----. 1 clickhouse clickhouse 172 Jun  5 02:50 table2_mergetree.sql
-rw-r-----. 1 clickhouse clickhouse 172 Jun  5 02:49 table_mergetree.sql
[root@FStachDEV2 314036bc-c3de-4628-8f4b-435f9340da52]# mv table2_mergetree.sql table2_mergetree.sql.bak
[root@FStachDEV2 314036bc-c3de-4628-8f4b-435f9340da52]# mv table_mergetree.sql table_mergetree.sql.bak

进入表table2_mergetree的目录/chdata/clickhouse/data/store/858,把表的数据目录改名

[root@FStachDEV2 314036bc-c3de-4628-8f4b-435f9340da52]# cd /chdata/clickhouse/data/store/858/858e6ec8-69f7-4a1b-852e-380f757939ca/
[root@FStachDEV2 858e6ec8-69f7-4a1b-852e-380f757939ca]# ll
drwxr-x---. 2 clickhouse clickhouse 4096 Jun  5 02:50 all_1_1_0
drwxr-x---. 2 clickhouse clickhouse    6 Jun  5 02:50 detached
-rw-r-----. 1 clickhouse clickhouse    1 Jun  5 02:50 format_version.txt
[root@FStachDEV2 858e6ec8-69f7-4a1b-852e-380f757939ca]# ll all_1_1_0
total 36
-rw-r-----. 1 clickhouse clickhouse 259 Jun  5 02:50 checksums.txt
-rw-r-----. 1 clickhouse clickhouse  72 Jun  5 02:50 columns.txt
-rw-r-----. 1 clickhouse clickhouse   2 Jun  5 02:50 count.txt
-rw-r-----. 1 clickhouse clickhouse  93 Jun  5 02:50 data.bin
-rw-r-----. 1 clickhouse clickhouse  58 Jun  5 02:50 data.cmrk3
-rw-r-----. 1 clickhouse clickhouse  10 Jun  5 02:50 default_compression_codec.txt
-rw-r-----. 1 clickhouse clickhouse   1 Jun  5 02:50 metadata_version.txt
-rw-r-----. 1 clickhouse clickhouse  38 Jun  5 02:50 primary.cidx
-rw-r-----. 1 clickhouse clickhouse 158 Jun  5 02:50 serialization.json
[root@FStachDEV2 858e6ec8-69f7-4a1b-852e-380f757939ca]# cd ..
[root@FStachDEV2 858]# mv 858e6ec8-69f7-4a1b-852e-380f757939ca 858e6ec8-69f7-4a1b-852e-380f757939ca.bak

进入表table_mergetree的目录/chdata/clickhouse/data/store/667,把表的数据目录改名

[root@FStachDEV2 858e6ec8-69f7-4a1b-852e-380f757939ca]# cd /chdata/clickhouse/data/store/667/66733022-fe6e-4753-9a11-9237f987f457
[root@FStachDEV2 66733022-fe6e-4753-9a11-9237f987f457]# ll
total 8
drwxr-x---. 2 clickhouse clickhouse 4096 Jun  5 02:50 all_1_1_0
drwxr-x---. 2 clickhouse clickhouse    6 Jun  5 02:49 detached
-rw-r-----. 1 clickhouse clickhouse    1 Jun  5 02:49 format_version.txt
[root@FStachDEV2 66733022-fe6e-4753-9a11-9237f987f457]# ll all_1_1_0/
total 36
-rw-r-----. 1 clickhouse clickhouse 259 Jun  5 02:50 checksums.txt
-rw-r-----. 1 clickhouse clickhouse  72 Jun  5 02:50 columns.txt
-rw-r-----. 1 clickhouse clickhouse   2 Jun  5 02:50 count.txt
-rw-r-----. 1 clickhouse clickhouse  93 Jun  5 02:50 data.bin
-rw-r-----. 1 clickhouse clickhouse  58 Jun  5 02:50 data.cmrk3
-rw-r-----. 1 clickhouse clickhouse  10 Jun  5 02:50 default_compression_codec.txt
-rw-r-----. 1 clickhouse clickhouse   1 Jun  5 02:50 metadata_version.txt
-rw-r-----. 1 clickhouse clickhouse  38 Jun  5 02:50 primary.cidx
-rw-r-----. 1 clickhouse clickhouse 158 Jun  5 02:50 serialization.json
[root@FStachDEV2 66733022-fe6e-4753-9a11-9237f987f457]# cd ..
[root@FStachDEV2 667]# mv 66733022-fe6e-4753-9a11-9237f987f457 66733022-fe6e-4753-9a11-9237f987f457.bak
[root@FStachDEV2 667]#[root@FStachDEV2 667]# systemctl start clickhouse-server
[root@FStachDEV2 667]# clickhouse-client
FStachDEV2 :) show databases;┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2.default3. │ information_schema │
4. │ lukestest1         │
5. │ system             │└────────────────────┘FStachDEV2 :) select *  from lukestest1.table2_mergetree;
Received exception from server (version 24.4.1):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Unknown table expression identifier 'lukestest1.table2_mergetree' in scope SELECT * FROM lukestest1.table2_mergetree. (UNKNOWN_TABLE)FStachDEV2 :) select *  from lukestest1.table_mergetree;
Elapsed: 0.001 sec.
Received exception from server (version 24.4.1):
Code: 60. DB::Exception: Received from localhost:9000. DB::Exception: Unknown table expression identifier 'lukestest1.table_mergetree' in scope SELECT * FROM lukestest1.table_mergetree. (UNKNOWN_TABLE)FStachDEV2 :) restore database lukestest1 from Disk('backups', 'lukestest1.zip');┌─id───────────────────────────────────┬─status───┐
1. │ d75ee6c1-8178-4e44-ae0c-6d64aeb79bb7 │ RESTORED │└──────────────────────────────────────┴──────────┘FStachDEV2 :) select *  from lukestest1.table_mergetree;┌─id─┬─────────create_time─┐1.12020-11-17 00:00:002.102020-11-17 00:00:003.112020-11-17 00:00:004.122020-11-17 00:00:005.22020-11-17 00:00:006.32020-11-17 00:00:007.42020-11-17 00:00:008.52020-11-17 00:00:009.62020-11-17 00:00:0010.72020-11-17 00:00:0011.82020-11-17 00:00:0012.92020-11-17 00:00:00 │└────┴─────────────────────┘FStachDEV2 :) select *  from lukestest1.table2_mergetree;┌─id─┬─────────create_time─┐1.12020-11-17 00:00:002.102020-11-17 00:00:003.112020-11-17 00:00:004.122020-11-17 00:00:005.22020-11-17 00:00:006.32020-11-17 00:00:007.42020-11-17 00:00:008.52020-11-17 00:00:009.62020-11-17 00:00:0010.72020-11-17 00:00:0011.82020-11-17 00:00:0012.92020-11-17 00:00:00 │└────┴─────────────────────┘

异机恢复实验,可以恢复
把服务器FStachDEV2的备份直接拷贝到服务器FStachDEV3就可以直接恢复(虽然拷贝到FStachDEV3后在FStachDEV3上查询system.backups没有结果,但是可以恢复)

root@FStachDEV3:~# mkdir /backups/
root@FStachDEV3:~# chmod 766 /backups/
root@FStachDEV3:~# cat /etc/clickhouse-server/config.d/backup_disk.xml
<clickhouse><storage_configuration><disks><backups><type>local</type><path>/backups/clickhouse/</path></backups></disks></storage_configuration><backups><allowed_disk>backups</allowed_disk><allowed_path>/backups/clickhousedir/</allowed_path></backups>
</clickhouse>root@FStachDEV3:~# systemctl restart clickhouse-server.serviceroot@FStachDEV3:~# clickhouse-client
FStachDEV3 :) select name,path,type from system.disks;┌─name────┬─path─────────────────┬─type──┐
1. │ backups │ /backups/clickhouse/Local2.default/var/lib/clickhouse/Local │└─────────┴──────────────────────┴───────┘FStachDEV3 :) select * from system.backups;
0 rows in set. Elapsed: 0.002 sec.
root@FStachDEV3:~# scp root@FStachDEV2:/backups/lukestest1.zip /backups/clickhouse/
root@FStachDEV3:~# clickhouse-client
FStachDEV3 :) select * from system.backups;
0 rows in set. Elapsed: 0.002 sec.FStachDEV3 :) show databases;┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2.default3. │ information_schema │
4. │ system             │└────────────────────┘FStachDEV3 :) restore database lukestest1 from Disk('backups','lukestest1.zip');┌─id───────────────────────────────────┬─status───┐
1.6a37bf36-e1a0-4b6f-8513-cd32865deec8 │ RESTORED │└──────────────────────────────────────┴──────────┘
FStachDEV3 :) show databases;┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2.default3. │ information_schema │
4. │ lukestest1         │
5. │ system             │└────────────────────┘FStachDEV3 :) use lukestest1;FStachDEV3 :) show tables;┌─name─────────────┐
1. │ table2_mergetree │
2. │ table_mergetree  │└──────────────────┘FStachDEV3 :) select * from table2_mergetree;┌─id─┬─────────create_time─┐1.12020-11-17 08:00:002.102020-11-17 08:00:003.112020-11-17 08:00:004.122020-11-17 08:00:005.22020-11-17 08:00:006.32020-11-17 08:00:007.42020-11-17 08:00:008.52020-11-17 08:00:009.62020-11-17 08:00:0010.72020-11-17 08:00:0011.82020-11-17 08:00:0012.92020-11-17 08:00:00 │└────┴─────────────────────┘FStachDEV3 :) select * from table_mergetree;┌─id─┬─────────create_time─┐1.12020-11-17 08:00:002.102020-11-17 08:00:003.112020-11-17 08:00:004.122020-11-17 08:00:005.22020-11-17 08:00:006.32020-11-17 08:00:007.42020-11-17 08:00:008.52020-11-17 08:00:009.62020-11-17 08:00:0010.72020-11-17 08:00:0011.82020-11-17 08:00:0012.92020-11-17 08:00:00 │└────┴─────────────────────┘

个人备份脚本(历史备份不会删除,所以代码里面需要加上一段删除30天之前的备份代码)

root@DDLACHDBDEV001:~# cat /root/script/clickhouse-client_backup.sh
#/bin/bash
backupdate=`date +%Y%m%d`
deletedate=`date -d '30 days ago' +%Y%m%d`echo `date`>>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.log
echo "Begin to backup...">>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.logclickhouse-client -h 127.0.0.1 -u default --password '123456' --port 9000 -q "backup database etl to Disk('backups','etl.zip');">>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.log
clickhouse-client -h 127.0.0.1 -u default --password '123456' --port 9000 -q "backup database shared to Disk('backups','shared.zip');">>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.logecho `date`>>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.log
echo "Backup Completed!">>/root/clickhouse_backuplog/clickhouse_backup_$backupdate.logmkdir /mnt/datadomaindir/clickhouse_backup/Stage/ODSONESCRCHSTG1/$backupdatemv /var/lib/docker/volumes/root_clickhouse_backup/_data/etl.zip /mnt/datadomaindir/clickhouse_backup/Stage/ODSONESCRCHSTG1/$backupdate/etl.zip
mv /var/lib/docker/volumes/root_clickhouse_backup/_data/shared.zip /mnt/datadomaindir/clickhouse_backup/Stage/ODSONESCRCHSTG1/$backupdate/shared.ziprm -rf /mnt/datadomaindir/clickhouse_backup/Stage/ODSONESCRCHSTG1/$deletedate

这篇关于Clickhouse备份恢复_clickhouse-client方式backup_restore命令备份恢复的使用介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073228

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R