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

相关文章

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen