时序数据库 InfluxDB
目錄
一、介紹
二、安裝
三、inflxudb保留字
四、基本語法
1、客戶端操作
1. 數據庫操作
2. 數據表和數據操作
3. series 操作
4.Shard?
5. 用戶操作
2、API操作
狀態碼
3、Java操作
五、常用函數?
六、存儲策略
1.查看策略
2.創建策略
3、修改策略
4. 刪除
七、目錄與文件結構
八、數據備份
1、備份和恢復DB數據
一、DB備份
二、DB恢復
二、備份和恢復元數據
1、備份元數據
2、恢復元數據
一、介紹
???????InfluxDB 是一個時間序列數據庫,GO 編寫的,旨在處理高寫入和查詢負載。InfluxDB 旨在用作涉及大量時間戳數據的任何用例的后備存儲,包括 DevOps 監控、應用程序指標、物聯網傳感器數據和實時分析。
特點:
- 專門為時間序列數據編寫的自定義高性能數據存儲。TSM 引擎允許高速攝取和數據壓縮
- 完全用 Go 編寫。它編譯成一個沒有外部依賴性的二進制文件。
- 簡單、高性能的寫入和查詢 HTTP API。
- 插件支持其他數據攝取協議,例如 Graphite、collectd 和 OpenTSDB。
- 專為輕松查詢聚合數據而定制的類似 SQL 的表達查詢語言。
- 標簽允許為系列建立索引以實現快速高效的查詢。
- 保留策略有效地自動使陳舊數據過期。
- 連續查詢自動計算聚合數據,使頻繁查詢更高效。
InfluxDB有三大特性:?
????Time Series (時間序列):你可以使用與時間有關的相關函數(如最大,最小,求和等)? ? ? ??
?? ?Metrics(度量):你可以實時對大量數據進行計算?
????Eevents(事件):它支持任意的事件數據
InfluxDB 提供三種操作方式:
InfluxDB 和傳統數據庫(如:MySQL)區別:
| database | 數據庫 |
| measurement | 數據庫中的表 |
| points | 每個表里某個時刻的某個條件下的一個 field 的數據,因為體現在圖表上就是一個點,于是將其稱為 point。Point 由時間戳(time)、數據(field)、標簽(tags)組成 |
| series | 序列,所有在數據庫中的數據,都需要通過圖表來展示,而這個 series 表示這個表里面的數據,可以在圖表上畫成幾條線。具體可以通過?SHOW SERIES FROM "表名"?進行查詢 |
| Retention policy | 數據保留策略,可以定義數據保留的時長,每個數據庫可以有多個數據保留策略,但只能有一個默認策略 |
注意:??point???由3部分組成??time+fields+tags??。
| time | 每行記錄都有一列time,主索引,記錄時間戳,單位納秒,時區UTC(東八區減8小時) |
| fields | 普通列,key-value結構,value數據類型支持型(float、integer、string、boolean) |
| tags | 索引列,key-value結構,value數據類型只支持string |
說明:
- 在插入新數據時,tag、field 和 time之間用空格分隔?。
- fields和tags key名稱嚴格區分大小寫。
?fields數據類型:
| 類型 | 備注 |
| float | influxdb的fields默認是float浮點型 |
| integer | 整型,insert語句如需寫入field是整型,需在數值后面加個i |
| string | 字符串,insert語句如需寫入field是字符串,需英文雙引號包含數值 |
| boolean | 布爾型,真可以用 t , T , true , True , TRUE表示;假可以用 f , F , false , False 或者 FALSE表示 |
注意
????????在influxdb中,字段必須存在。因為字段是沒有索引的。如果使用字段作為查詢條件,會掃描符合查詢條件的所有字段值,性能不及tag。tags是可選的,但是強烈建議你用上它,因為tag是有索引的,tags相當于SQL中的有索引的列。tag value只能是string類型。
端口
- 8083:Web admin 管理服務的端口,?http://localhost:8083
- 8086:HTTP API 的端口
- 8088:集群端口 (目前還不是很清楚, 配置在全局的 bind-address,默認不配置就是開啟的)
二、安裝
docker pull influxdb:1.8.3 docker run -d -p 18083:8083 -p 18088:8088 -p 18086:8086 --name my_influxdb influxdb:1.8.3 docker container update --restart=always my_influxdb可視化工具:
1、web界面?
2、influxDB Studio?
客戶端為綠色版,下載解壓打開即可。
下載地址:Releases · CymaticLabs/InfluxDBStudio
案例數據:
curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt?
導入數據:?
influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database?
三、inflxudb保留字
?
四、基本語法
docker exec -it my_influxdb ?bash
cd /etc/influxdb/
influx?
1、客戶端操作
1. 數據庫操作
# 查看所有數據庫
show databases;
# 建庫
create database dbname;
# 刪庫
drop database daname
# 切換使用數據庫
use dbname
2. 數據表和數據操作
查看所有表
show measurements
數據中的時間字段默認顯示的是一個納秒時間戳,改成可讀格式。時間默認是UTC時間
precision rfc3339; # 之后再查詢,時間就是rfc3339標準格式?
# 或可以在連接數據庫的時候,直接帶該參數
influx -precision rfc3339
查看一個measurement中所有的tag key
show tag keys
?查看一個measurement中所有的field key
show field keys
查看一個measurement中所有的保存策略(可以有多個,一個標識為default)
?show retention policies;
插入數據
????????標準格式,注意在寫數據的時候如果不添加時間戳,系統會默認添加一個時間。InfluxDB 中沒有顯式的新建表的語句,只能通過 insert 數據的方式來建立新表。
insert <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]insert 表名,tags fileds;#插入fields,和tags.
insert student,a=1,b=2,c=3 name="sa",age=12,emial="xxx@163.com";
#只插入??fields???,可以沒有??tags
insert student name="sa",age=12,emial="xxx@163.com";
刪表
drop measurement student
?查詢?
SELECT field keys [time | tag kyes | * ] FROM measurements WHERE conditions GROUP BY [tag keys | time] ORDER BY time [asc | desc] LIMIT number [OFFSET number]
正則?
#每個表輸出一行(支持 Go 語言的正則表達式、支持類似于 MySQL 中的 limit 語句)
SELECT * FROM /.*/ LIMIT 1
limit
limit???可單獨使用,也可配合??offset???使用,??offset??偏移量的意思
select * from student limit 2;
排序
?order by??? 只能對??time???進行排序,??asc???升序,??desc??降序。
select * from student ?order by time desc;
分組
SELECT <function>(<field_key>) FROM_clause WHERE <time_range> GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]?
(1)group by tag
select * from h2o_pH group by location limit 2
(2)group by time(1m)?
????????對??time???分組時并不是簡單的??group by time???,??time???后面還需要加一個分組聚合的持續時間,如??group by time(1m)??。支持的持續時間單位有:
(3)fill(0)填充null
????????可以看到??values???結果集中有??null???的情況,可在查詢語句中加??fill(0)???,遇到??null???用??0???來填充。??fill()??中只能填數字。
條件查詢
select * from student where a='1' and age=12; # a字段是tag :字符串
select sum(age) as ageNums from student where time < now() group by a order by time desc;
格式化顯示查詢數據
format json
select * from student where a='1' and age=12;
模糊查詢(正則表達式)
# location名稱中包含coyote的數據
select * from h2o_quality where location=~/.*coyote.*/ limit 10
沒有in還有or
select * from h2o_pH where location='coyote_creek' or location='santa_monica' limit 4
from多表查詢?
????????多表查詢,以時間進行連接,不存在的值用null填充。一般情況連接的兩張表tag和field上有一定的聯系和比較,毫不相干的兩表連接查詢沒什么價值。
select * from h2o_feet,h2o_pH limit 1
注意:
1.field tag是關鍵字 如果字段名是這兩個,則需要加上單引號。
2.tags???之間用逗號分隔,??fields??之間用逗號分隔,???tags??和??fields??之間用空格分隔?。
3.tags???都是字符串類型,但是不用雙引號括起來;??fields??中有字符串類型需要用?英文雙引號?括起來,如果不用英文雙引號,會報語法錯誤??invalid boolean??,會認為是無效的布爾值,因為布爾類型無需加雙引號。
4.tags???中設置布爾值就是字符串,??fields???中有布爾值,可用 ??t , T , true , True , TRUE,f , F , false , False??表示。
3. series 操作
????????series 相當于是 InfluxDB 中一些數據的集合,在同一個 database 中,retention policy、measurement、tag sets 完全相同的數據同屬于一個 series,同一個 series 的數據在物理上會按照時間順序排列存儲在一起。
??shard???主要由4部分組成??Cache???、??Wal???、??Tsm file???、??Compactor??。
#series 表示這個表里面的數據,可以在圖表上畫成幾條線,series 主要通過 tags 排列組合算出來。
show series from student;
4.Shard?
????????shard 在 InfluxDB 中是一個比較重要的概念,它和 retention policy 相關聯。每一個存儲策略下會存在許多 shard,每一個 shard 存儲一個指定時間段內的數據,并且不重復,例如 7點-8點 的數據落入 shard0 中,8點-9點的數據則落入 shard1 中。每一個 shard 都對應一個底層的 tsm 存儲引擎,有獨立的 cache、wal、tsm file。
????????如果創建一個新的 retention policy 設置數據的保留時間為 1 天,則單個 shard 所存儲數據的時間間隔為 1 小時,超過1個小時的數據會被存放到下一個 shard 中。
5. 用戶操作
# 顯示用戶
SHOW USERS
# 創建用戶
CREATE USER "username" WITH PASSWORD 'password'
# 創建管理員權限的用戶?
#influxdb 的權限設置比較簡單,只有讀、寫、ALL 幾種。
CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES
# 刪除用戶
DROP USER "username"
2、API操作
狀態碼
- 2xx:服務請求正常
- 4xx:代表請求語法有問題
- 5xx:服務端出問題,導致超時等故障
官方地址
3、Java操作
<dependency><groupId>org.influxdb</groupId><artifactId>influxdb-java</artifactId><version>2.23</version> </dependency> spring:application:name: spring-lean-influxdbinflux:url: http://192.168.56.22:18086user:password:database: test import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Data @Configuration public class InfluxDBConfig {@Value("${spring.influx.user}")public String userName;@Value("${spring.influx.password}")public String password;@Value("${spring.influx.url}")public String url;//數據庫@Value("${spring.influx.database}")public String database; } import lombok.Builder; import lombok.Data; import org.influxdb.annotation.Column; import org.influxdb.annotation.Measurement; import org.influxdb.annotation.TimeColumn;import java.util.Date;@Builder @Data @Measurement(name = "t_log") public class LogInfo {// Column中的name為measurement中的列名// 此外,需要注意InfluxDB中時間戳均是以UTC時保存,在保存以及提取過程中需要注意時區轉換@Column(name = "time")private String time;// 注解中添加tag = true,表示當前字段內容為tag內容@Column(name = "module", tag = true)private String module;@Column(name = "level", tag = true)private String level;@Column(name = "device_id", tag = true)private String deviceId;@Column(name = "msg")private String msg;@TimeColumnprivate Date createTime; } import com.lean.influxdb.config.InfluxDBConfig; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.influxdb.dto.Query; import org.influxdb.dto.QueryResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils;import javax.annotation.PostConstruct; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit;@Service public class InfluxDBService {@Autowiredprivate InfluxDBConfig influxDBConfig;@PostConstructpublic void initInfluxDb() {this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;this.influxDB = influxDbBuild();}//保留策略private String retentionPolicy;private InfluxDB influxDB;/*** 連接時序數據庫;獲得InfluxDB**/private InfluxDB influxDbBuild() {if (influxDB == null) {if(StringUtils.isEmpty(influxDBConfig.userName)){influxDB = InfluxDBFactory.connect(influxDBConfig.url);}else {influxDB = InfluxDBFactory.connect(influxDBConfig.url, influxDBConfig.userName, influxDBConfig.password);}influxDB.setDatabase(influxDBConfig.database);}return influxDB;}/*** 插入*/public void insertPoint(Point point) {influxDbBuild();influxDB.write(point);}/*** 插入** @param measurement 表* @param tags 標簽* @param fields 字段*/public void insert(String measurement, Map<String, String> tags, Map<String, Object> fields) {influxDbBuild();Point.Builder builder = Point.measurement(measurement);builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);influxDB.write(influxDBConfig.database, "", builder.build());}/*** @param measurement* @param time* @param tags* @param fields* @return void* @desc 插入, 帶時間time*/public void insert(String measurement, long time, Map<String, String> tags, Map<String, Object> fields) {influxDbBuild();Point.Builder builder = Point.measurement(measurement);builder.time(time, TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);influxDB.write(influxDBConfig.database, "", builder.build());}/*** 查詢** @param command 查詢語句* @return*/public QueryResult query(String command) {influxDbBuild();return influxDB.query(new Query(command, influxDBConfig.database));}/*** @param queryResult* @desc 查詢結果處理*/public List<Map<String, Object>> queryResultProcess(QueryResult queryResult) {List<Map<String, Object>> mapList = new ArrayList<>();List<QueryResult.Result> resultList = queryResult.getResults();//把查詢出的結果集轉換成對應的實體對象,聚合成listfor (QueryResult.Result query : resultList) {List<QueryResult.Series> seriesList = query.getSeries();if (seriesList != null && seriesList.size() != 0) {for (QueryResult.Series series : seriesList) {List<String> columns = series.getColumns();String[] keys = columns.toArray(new String[columns.size()]);List<List<Object>> values = series.getValues();if (values != null && values.size() != 0) {for (List<Object> value : values) {Map<String, Object> map = new HashMap(keys.length);for (int i = 0; i < keys.length; i++) {map.put(keys[i], value.get(i));}mapList.add(map);}}}}}return mapList;}/*** @desc InfluxDB 查詢 count總條數*/public long countResultProcess(QueryResult queryResult) {long count = 0;List<Map<String, Object>> list = queryResultProcess(queryResult);if (list != null && list.size() != 0) {Map<String, Object> map = list.get(0);double num = (Double) map.get("count");count = new Double(num).longValue();}return count;}/*** 創建數據庫* @param dbName 創建數據庫* @return*/public void createDB(String dbName) {influxDbBuild();influxDB.createDatabase(dbName);}/*** 批量寫入測點* @param batchPoints*/public void batchInsert(BatchPoints batchPoints) {influxDbBuild();influxDB.write(batchPoints);}/*** 批量寫入數據** @param database 數據庫* @param retentionPolicy 保存策略* @param consistency 一致性* @param records 要保存的數據(調用BatchPoints.lineProtocol()可得到一條record)*/public void batchInsert(final String database, final String retentionPolicy,final InfluxDB.ConsistencyLevel consistency, final List<String> records) {influxDbBuild();influxDB.write(database, retentionPolicy, consistency, records);}/*** @param consistency* @param records* @desc 批量寫入數據*/public void batchInsert(final InfluxDB.ConsistencyLevel consistency, final List<String> records) {influxDbBuild();influxDB.write(influxDBConfig.database, "", consistency, records);}} import com.lean.influxdb.entity.LogInfo; import com.lean.influxdb.service.InfluxDBService; import org.influxdb.dto.Point; import org.influxdb.dto.QueryResult; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit;@SpringBootTest class SpringLeanInfluxdbApplicationTests {@Testvoid contextLoads() {}@Autowiredprivate InfluxDBService influxDBService;@Testpublic void test() {LogInfo logInfo = LogInfo.builder().level("1").module("log").deviceId("1").msg("消息").createTime(new Date()).build();Point point = Point.measurementByPOJO(logInfo.getClass()).addFieldsFromPOJO(logInfo).time(System.currentTimeMillis(), TimeUnit.MILLISECONDS).build();influxDBService.insertPoint(point);}@Testpublic void test1() {Integer pageSize = 15;Integer pageNum = 1;// InfluxDB支持分頁查詢,因此可以設置分頁查詢條件String pageQuery = " LIMIT " + pageSize + " OFFSET " + ((pageNum - 1) * pageSize);// 此處查詢所有內容,如果String queryCmd = "SELECT * FROM student ORDER BY time DESC " + pageQuery;QueryResult queryResult = influxDBService.query(queryCmd);List<Map<String, Object>> maps = influxDBService.queryResultProcess(queryResult);maps.stream().forEach(s->{s.forEach((k,v)->{System.out.printf("k",k);System.out.printf("v",v);});});List<QueryResult.Result> resultList = queryResult.getResults();System.out.println(resultList);}@Testpublic void testSave() {String measurement = "student";Map<String, String> tags = new HashMap<>();tags.put("code", "1");tags.put("studentNums", "1");Map<String, Object> fields = new HashMap<>();fields.put("name", "張三");fields.put("age", "11");influxDBService.insert(measurement, tags, fields);}@Testpublic void testGetdata() {String command = "select * from student";QueryResult queryResult = influxDBService.query(command);List<Map<String, Object>> result = influxDBService.queryResultProcess(queryResult);for (Map map : result) {System.out.println("time:" + map.get("time")+ " code:" + map.get("code")+ " studentNums:" + map.get("studentNums")+ " name:" + map.get("name")+ " age:" + map.get("age"));}}}五、常用函數?
| COUNT() | BOTTOM() | CEILING() |
| DISTINCT() | FIRST() | DERIVATIVE() |
| INTEGRAL() | LAST() | DIFFERENCE() |
| MEAN() | MAX() | ELAPSED() |
| MEDIAN() | MIN() | FLOOR() |
| SPREAD() | PERCENTILE() | HISTOGRAM() |
| SUM() | TOP() | MOVING_AVERAGE() |
| NON_NEGATIVE_DERIVATIVE() | ||
| STDDEV() |
更多查看官網:地址
六、存儲策略
????????InfluxDB 每秒可以處理成千上萬條數據,要將這些數據全部保存下來會占用大量的存儲空間,有時需要自動清理歷史數據。
1.查看策略
?????????一個database可以有多個保留策略??retention policy???,但是只能有一個默認??retention policy??。
show retention policies on databaseName
2.創建策略
數據庫新建都會分配一個默認的保留策略:
- name??,保留策略的名稱。
- ??duration???,數據保留的持續時長,最小為??1h???。如果設置為0,數據永久保存(官方默認RP),否則過期清理。它具有各種時間參數,比如:h(小時),w(星期)
- ??shardGroupDuration???,數據存儲在??shardGroup???的時間跨度。??shardGroup???是??influxdb???的一個邏輯存儲結構,其下包含多個??shard??。
- ??replicaN??,全稱replication,復制因子,它決定在集群中存儲多少個數據副本。inflxudb集群中跨N個數據節點復制數據,其中N就是復制因子。復制因子對單個節點實例不起作用,單機版默認是1。
- ??default??,true為默認保留策略。
基本語法:
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
- retention_policy_name??: 策略名。
- ??database_name??: 數據庫名(db必須存在)。
- ??duration??: 數據保留時長。
- ??REPLICATION??: 復制因子,單機版設置為1即可。
- ??SHARD DURATION???:設置??shardGroupDuration???時長,表示每個??shard group??時間跨度時長。可不填,默認根據RP的duration計算。
- ??default??: true為設置該RP為默認RP。
CREATE RETENTION POLICY "策略名稱" ON "表名稱" DURATION 30d REPLICATION 1 DEFAULT
3、修改策略
?ALTER RETENTION POLICY "策略名稱" ON "表名稱" DURATION 3w DEFAULT
4. 刪除
DROP RETENTION POLICY "策略名稱" ON "表名稱"
七、目錄與文件結構
InfluxDB 的數據存儲主要有三個目錄。默認情況下是 meta, wal 以及 data 三個目錄。
?shard:
? ? ? ? ??influxdb???存儲引擎??TSM???的具體實現。??TSM TREE???是專門為??influxdb???構建的數據存儲格式。與現有的??B+ tree???或??LSM tree???實現相比,??TSM tree??具有更好的壓縮和更高的讀寫吞吐量。主要由4部分組成??Cache???、??Wal???、??Tsm file???、??Compactor??。
shard group:
??????????存儲??shard???的邏輯容器,每一個??shard group???都有一個不重疊的時間跨度,可根據保留策略??retention policy???的??duration???換算而得。數據根據不同的時間跨度存儲在不同的??shard group??中。
cache :?
????????在內存中是一個簡單的 map 結構,這里的 key 為 seriesKey + 分隔符 + filedName,目前代碼中的分隔符為 #!~#,entry 相當于是一個按照時間排序的存放實際值的數組。
????????插入數據時,實際上是同時往 cache 與 wal 中寫入數據,可以認為 cache 是 wal 文件中的數據在內存中的緩存。當 InfluxDB啟動時,會遍歷所有的 wal 文件,重新構造 cache,這樣即使系統出現故障,也不會導致數據的丟失。
wal:
?????????對數據的修改以日志的形式持久化存儲在磁盤上。
????????內容與內存中的 cache 相同,其作用就是為了持久化數據,當系統崩潰后可以通過 wal 文件恢復還沒有寫入到 tsm 文件中的數據。
????????文件中的一條數據,對應的是一個 key(measument + tags + fieldName) 下的所有 value 數據,按照時間排序。
tsm file:
????????真實存放數據的文件,單個 tsm file 大小最大為 2GB。每隔一段時間,內存中的時序數據就會執行flush操作將數據寫入到文件。
compactor:
????????在后臺持續運行,每隔 1 秒會檢查一次是否有需要壓縮合并的數據。主要進行兩種操作,一種是 cache 中的數據大小達到閥值后,進行快照,之后轉存到一個新的 tsm 文件中。另外一種就是合并當前的 tsm 文件,將多個小的 tsm 文件合并成一個,使每一個文件盡量達到單個文件的最大大小,減少文件的數量,并且一些數據的刪除操作也是在這個時候完成。
數據存儲
LSM-Tree VS B-Tree
八、數據備份
????????兩種備份方式:1.db備份 2.元數據備份。元數據備份的備份是整個備份,不能拆分,而db數據的備份,完整的、增量的(從 RFC3339 格式的時間開始),或者針對特定的分片 ID。
1、備份和恢復DB數據
一、DB備份
基本語法:
通過??influxd backup -h??查看??backup??有哪些可選參數。
?Usage: influxd backup [options] PATH
-portable: 默認
-host <host:port> # 需要備份的influxdb服務機器地址,可選,Defaults to 127.0.0.1:8088.
-database <name> # 需要備份的db名稱,可選,若沒有指定,將備份所有數據庫
-retention <name> # 備份某個保留策略的數據,未指定,則備份所有rp的數據。
-shard <id> # 需要備份的shard id,可選,若指定了備份shard,必須先選擇rp
-start # 起始時間,日期必須采用 RFC3339格式(例如, 2015-12-24T08:12:23Z). 不能和-since一起使用
-end # 結束時間,日期必須采用 RFC3339格式(例如, 2015-12-24T08:12:23Z) 不能和-since一起使用
-since # 備份這個timestamp之后的數據,建議用-start <timestamp>代替
-skip-errors # 可選,當備份shards時,跳過備份失敗的shard,繼續備份其他shard。
influxd backup -database <mydatabase> <path-to-backup>
mydatabase是您要備份的數據庫的名稱,以及path-to-backup備份數據應該存儲的位置。
注意:?Metastore 備份也包含在每個數據庫的備份中
案例:
1.備份所有數據庫
influxd backup -portable /path/to/backup-directory
2.備份school庫的所有數據。
influxd backup -portable -db school ~/tmp/influx_backup/
3.備份school 庫昨天的數據。
influxd backup -portable -db school -start 2022-11-14T13:24:52.085243953Z -end 2020-11-15T13:24:52.085243953Z ~/tmp/influx_backup_yesterday/
4.只備份school ???的??shard=2??的數據
influxd backup -portable -db school -shard 2 ~/tmp/influx_backup_2/
5.遠程備份(所有數據庫)
influxd backup -portable -host 1192.168.56.11:8088 /path/to/backup-directory
二、DB恢復
使用該influxd restore實用程序將時間序列數據和元數據從 InfluxDB 備份還原到 InfluxDB。?
?influxd restore -h??查看restore可選參數:
Usage: influxd restore -portable [options] PATH
Note: Restore using the '-portable' option consumes files in an improved Enterprise-compatible?
? format that includes a file manifest.
Options:
? ? -portable?
? ? ? ? ? ??
? ? -host ?<host:port>
? ? ? ? ? ??
? ? -db ? ?<name>
? ? ? ? ? ? 從備份數據的哪個庫恢復數據
? ? -newdb <name>
? ? ? ? ? ? 數據恢復到新庫名稱,若沒有指定,選擇-db <name>的名稱。
?? ??? ??? ?newdb不存在,恢復時會自動創建
? ? -rp ? ?<name>
? ? ? ? ? ? 從備份數據的哪個rp恢復數據,指定了-rp,必須指定-db
? ? -newrp <name>
? ? ? ? ? ? 恢復數據新的rp名稱,newrp必須存在。指定了-rp,未指定-newrp則使用-rp
? ? -shard <id>
? ? ? ? ? ? 需要恢復的shard,如果指定了'-db <db_name>' and '-rp <rp_name>',必須-shard<id>
? ? PATH
? ? ? ? ? ? 備份數據文件list?
案例:
1.恢復??~/tmp/influx_backup/???下??school???庫數據到新庫??new_school。
influxd restore -portable ?-db school -newdb new_school ?~/tmp/influx_backup/
?2.恢復??~/tmp/influx_backup/???下??school???庫,??rp???為??rp_3???數據到新庫??new_school1??。
influxd restore -portable ?-db school -rp rp_3 -newdb new_school1 ?~/tmp/influx_backup/
3.恢復??~/tmp/influx_backup/???下??school???庫,??rp???為??rp_3???,??shard???為2的數據到新庫??new_school2???,并重命名??rp???的名稱為??rp_3days??。
influxd restore -portable ?-db school -rp rp_3 -shard 2 ?-newdb new_school2 ? -newrp rp_3days ~/tmp/influx_backup/
注意:
二、備份和恢復元數據
1、備份元數據
influxd backup <path-to-backup>
備份元數據,沒有任何其他參數,備份將只轉移當前狀態的系統元數據到??path-to-backup???。??path-to-backup??為備份保存的目錄,不存在會自動創建。
influxd backup tmp/mata_backup
?
?
2、恢復元數據
?基本語法:
influxd restore -metadir <path-to-meta-or-data-directory> <path-to-backup>
參考來源:?
influxdb官方英文文檔
influxdb中文文檔
https://segmentfault.com/a/1190000012385313
總結
以上是生活随笔為你收集整理的时序数据库 InfluxDB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: #806.宝箱 思维
- 下一篇: HDOJ:1863畅通工程