Logstash无法识别PostgreSQL中已创建的products表问题求助
解决Logstash JDBC无法识别PostgreSQL中已存在的products表问题
针对你遇到的Logstash能连接PostgreSQL但提示products表不存在的问题,以下是几种常见排查方向和解决办法:
1. 检查表名大小写与引号问题
PostgreSQL默认会把未加引号的标识符(表名、列名等)转换为小写。如果你的表实际是Products、PRODUCTS或者带大写字母的命名,直接写SELECT * FROM products;会找不到表。
- 解决办法:要么把表名改成全小写,要么在SQL语句中给表名加双引号:
SELECT * FROM "Products";
2. 指定表所在的Schema
如果你的products表不是建在默认的public schema下,需要在SQL语句中明确指定schema名:
SELECT * FROM your_schema_name.products;
如果不确定表的schema,可进入PostgreSQL容器执行以下SQL查询:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_name LIKE '%products%';
3. 确认连接的数据库是否正确
检查Logstash配置中的jdbc_connection_string里的shopdb是否是你实际创建products表的数据库。可能存在你在其他库建表,但Logstash连接了空库的情况。
- 验证方式:进入PostgreSQL容器,切换到shopdb库查看表:
docker exec -it elastic-postgres-1 psql -U postgres -d shopdb # 进入后执行 \dt
如果看不到products表,说明你建表的库不是shopdb,或者表没创建成功。
4. 检查PostgreSQL数据持久化
如果你的PostgreSQL容器没有挂载本地数据卷,每次重启容器后,之前创建的表和数据都会丢失。检查你的docker-compose.yml中PostgreSQL服务的volumes配置,确保有类似这样的挂载:
services: postgres: image: postgres:xxx volumes: - ./postgres-data:/var/lib/postgresql/data
如果没有挂载,重启容器后表会消失,需要重新创建并填充数据,同时添加数据卷配置保证持久化。
5. 验证用户权限(概率较低)
虽然使用的是postgres超级用户,但也可以确认下该用户是否有products表的访问权限:
SELECT has_table_privilege('postgres', 'products', 'select');
返回t表示有权限,f则需要给用户授权:
GRANT SELECT ON products TO postgres;
内容的提问来源于stack exchange,提问作者Nelia
相关产品推荐
相关产品推荐

