postgres数据库表数据增量统计

本文介绍了一个用于数据库统计和监控的自定义解决方案,包括创建用于记录数据库大小、表数量及表空间使用情况的表格,以及一个PL/pgSQL函数,该函数通过连接到不同的数据库实例来收集这些信息,并将其存储在统一的监控表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.用于保存统计数据总量的表 

CREATE TABLE IF NOT EXISTS recording_size_table(
  id serial,
  group_id int,
  database_name varchar(255),
  database_record int,
  schema_record varchar,
  tablespace_size varchar,
  record_time varchar(32) DEFAULT to_char(now(), 'YYYY-MM-DD HH24:MI:SS')
)
WITH (
  OIDS = FALSE
);

2.统计数据总量的函数 

-- 创建函数
CREATE OR REPLACE FUNCTION table_recording_size(gaddr varchar, gport int, guser varchar, gpwd varchar) returns void AS
$body$
	DECLARE
		rcd record;
		rcd_tmp record;
		str varchar;
		group_ids integer;
		connect_sql varchar;
		database_records integer;
		schema_str varchar;
		tablespace_str varchar;
		exec_sql varchar;
		conn varchar;
	BEGIN
		-- 设置group_ids
		group_ids = (SELECT COALESCE(max(group_id), 0) + 1 AS max FROM recording_size_table)::integer;

		-- 遍历所有数据库
		FOR rcd IN SELECT datname, (tup_inserted - tup_deleted) AS counts FROM pg_stat_database
			WHERE datname <> 'template0' AND datname <> 'template1' ORDER BY datname
		loop
			database_records = 0;

			-- 创建dblink连接
			conn = 'dbconn';
			connect_sql = 'host=' || gaddr || ' port=' || gport || ' user=' || guser
				|| ' password=' || gpwd || ' dbname=' || rcd.datname;
			str = (SELECT dblink_connect(conn,connect_sql));

			-- 创建统计表条数的函数
			exec_sql = 'create or replace function count_numbers_of_table(sch varchar, tab varchar) returns integer as
				$$
					declare
						rcd record;
					begin
						execute(''select count(*) from ''' || ' || sch' || ' || ''.''' || ' || tab) into rcd;
						return rcd.count;
					end;
				$$ language plpgsql';
			str = (select dblink_exec(conn, exec_sql));

			-- 查询数据库的数据总量
			exec_sql = 'select sum(count_numbers_of_table(pg_stat_user_tables.schemaname::text,
				pg_stat_user_tables.relname::text)) as counts from pg_stat_user_tables group by schemaname';
			for rcd_tmp in select * from dblink(conn, exec_sql) as a(counts integer)
			loop
				database_records = database_records + rcd_tmp.counts;
			end loop;

			-- 查询所有模式的数据总量
			exec_sql = 'select schemaname, sum(count_numbers_of_table(pg_stat_user_tables.schemaname::text,
				pg_stat_user_tables.relname::text)) as counts from pg_stat_user_tables group by schemaname';
			schema_str = '{' || (SELECT string_agg('"'||schemaname||'":'||counts,',') AS record_size FROM (
				select * from dblink(conn, exec_sql) as a(schemaname varchar, counts integer)) as b) || '}';

			-- 断开连接
			str = (SELECT dblink_disconnect(conn));

			-- 保存查询数据
			INSERT INTO recording_size_table(group_id, database_name, database_record, schema_record) VALUES (group_ids, rcd.datname, database_records, schema_str);
		END loop;

		-- 查询表空间大小
		tablespace_str = '{'||(
			SELECT string_agg('"'||spcname||'":'||spcsize,',') AS tablespace_str
			FROM (SELECT spcname, pg_tablespace_size(pg_tablespace.spcname) AS spcsize
			FROM pg_tablespace) AS spc
		)||'}';

		-- 插入表空间大小
		EXECUTE('update recording_size_table set tablespace_size = ''' || tablespace_str || ''' where id = (select max(id) from recording_size_table)');

	END;
$body$ LANGUAGE plpgsql;

-- drop函数
-- drop function if exists table_recording_size(gaddr varchar, gport int, guser varchar, gpwd varchar);

-- 执行函数
-- select table_recording_size('127.0.0.1', 5432, 'postgres', '123456');

-- 查询统计数据
-- select * from recording_size_table order by database_name, group_id;
-- delete from recording_size_table;

-- 断开dblink
-- SELECT dblink_disconnect('dbconn')

 

<think>好的,我现在需要解决用户的问题:如何将PostgreSQL中的虚拟机资源使用记录同步到Apache Doris,并通过DeepSeek进行分析。首先,我需要明确用户的需求,他们可能希望实时或定时同步数据,并且进行高效的分析。 首先,同步数据的方法。Apache Doris支持多种数据导入方式,比如使用DataX或者Flink这样的ETL工具。PostgreSQL有逻辑复制功能,可以输出WAL日志,或许可以通过Debezium这样的CDC工具捕获变更,然后写入Kafka,再由Doris的Routine Load消费。另外,Doris也支持JDBC外,可以直接查询PostgreSQL数据,但可能不适合大数据量。需要比较这些方法的优缺点,用户可能需要实时同步,所以CDC方案可能更合适。 然后,结合DeepSeek进行分析。DeepSeek是一个AI平台,可能需要将Doris中的数据导出或通过API接口让DeepSeek访问。或者,DeepSeek是否支持直接连接Doris作为数据源?需要确认DeepSeek的集成方式,可能需要通过JDBC或者Rest API来调用分析。 可行性方面,Doris的MPP架构适合高并发复杂查询,处理亿级数据没问题。用户之前测试过Doris 1.x版本,可能存在一些函数不支持的问题,需要确认当前版本是否已经解决。比如,聚合函数或时间函数是否满足需求。另外,同步过程中数据一致性很重要,尤其是CDC方式,要确保不丢数据,并且处理延迟。 具体步骤可能包括:配置PostgreSQL的逻辑解码插件,设置Debezium连接器,将数据变更发送到Kafka,然后Doris创建Routine Load任务,持续导入数据。然后,在Doris中建立合适的结构,优化分区分桶,确保查询性能。之后,通过DeepSeek的API或JDBC连接Doris,执行分析任务,比如资源使用预测、异常检测等。 还需要考虑数据清洗转换,可能在同步过程中使用Flink进行实时处理,或者在Doris中使用物化视图预处理数据。此外,同步任务的监控错误处理机制也很重要,比如处理网络中断或数据格式错误。 最后,验证方案的可行性,可能需要测试同步速度、数据准确性,以及DeepSeek分析的效果。如果遇到函数不兼容的情况,可能需要自定义UDF或寻找替代方案。同时,评估整个架构的维护成本扩展性,确保能够支持未来的数据增长。</think>### 从 PostgreSQL 同步虚拟机资源到 Doris 的方案 #### 一、数据同步方法 1. **实时同步(CDC 方案)** - **使用 Debezium + Kafka + Doris Routine Load** - 配置 PostgreSQL 逻辑解码插件(如 `wal2json` 或 `pgoutput`)[^1],开启逻辑复制槽 - 通过 Debezium 捕获数据变更事件并写入 Kafka - Doris 创建 Routine Load 任务,从 Kafka 消费数据并写入目标 - 示例 Doris 建语句: ```sql CREATE TABLE vm_metrics ( vm_id BIGINT, cpu_usage DOUBLE, mem_usage DOUBLE, timestamp DATETIME ) ENGINE=OLAP DUPLICATE KEY(vm_id, timestamp) PARTITION BY RANGE(timestamp)() DISTRIBUTED BY HASH(vm_id) BUCKETS 10; ``` 2. **批量同步(离线方案)** - **使用 DataX 或 Airflow 定时调度** - 编写 DataX 的 `postgresqlreader` `doriswriter` 插件配置文件 - 通过 crontab 或 Airflow DAG 实现周期性增量同步 - 增量识别字段建议:`timestamp` 或 `update_time` #### 二、与 DeepSeek 的集成 1. **直接连接分析** - 若 DeepSeek 支持 JDBC 连接,可直接配置 Doris 作为数据源: ```python # DeepSeek 示例代码 import doris conn = doris.connect(host='doris-fe', port=9030, user='user', password='pass') df = conn.execute("SELECT vm_id, AVG(cpu_usage) FROM vm_metrics GROUP BY vm_id") ``` 2. **API 交互模式** - 通过 Doris 的 REST API 导出分析结果(需 Doris 1.2+ 版本支持 HTTP 查询) - 将 JSON 结果传递给 DeepSeek 进行 AI 模型训练或预测 #### 三、可行性评估 1. **性能匹配性** - Doris 的 MPP 架构可支撑亚秒级响应,适合虚拟机监控高频写入场景(测试数据:单节点写入吞吐约 10K rows/s) - 通过 `ROLLUP` 预聚合加速 DeepSeek 的时序分析 2. **功能验证** - 测试重点: - PostgreSQL 的 `JSONB` 字段解析(如资源元数据)是否兼容 - DeepSeek 是否支持 Doris 的分时统计函数(如 `time_slice`) - 规避方案: - 复杂计算通过 Flink 预处理后再写入 Doris - 缺失函数通过 UDF 扩展 3. **运维成本** - Doris 的弹性扩缩容能力(BE 节点动态增减)可适配资源波动场景 - 需监控同步延迟指标(可通过 `SHOW ROUTINE LOAD` 查看 Kafka 消费进度)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

password-u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值