AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 254466
Accepted
Freedo
Freedo
Asked: 2019-11-30 14:52:53 +0800 CST2019-11-30 14:52:53 +0800 CST 2019-11-30 14:52:53 +0800 CST

禁用数据库表进行写入,但报告写入成功

  • 772

我管理一个数据库,每天都会创建数千 GB 的无用日志数据。

我无法修复执行所有这些(不必要的)日志记录的软件。有没有办法锁定(或禁用写入)此日志表,使其永远不会被写入,但同时它会报告写入成功,因此不会导致软件出现问题?

我知道我可以用 cronjob 截断表,但我想知道是否有更好的方法?

mariadb storage-engine
  • 1 1 个回答
  • 179 Views

1 个回答

  • Voted
  1. Best Answer
    Vérace
    2019-11-30T21:11:48+08:002019-11-30T21:11:48+08:00

    MySQL和朋友,即MariaDB和Percona,有一个相当不寻常的存储机制,称为黑洞引擎- 它可能有助于您的特定请求(请参阅此处的小提琴)。

    例如,如果您这样做:

    CREATE TABLE foo
    (
      bar INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
      baz VARCHAR (30) NOT NULL
    ) ENGINE = InnoDB;
    Query OK, 0 rows affected (0.07 sec)
    

    无论如何,默认引擎是InnoDB,但为了清楚起见,我只是在这里明确。

    然后,我们输入几条记录:

    mysql> INSERT INTO foo (baz) VALUES ('afadfa'), ('sfasdfa'), ('asdfadf');
    Query OK, 3 rows affected (0.01 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    那里没有问题!然后,检查我们:

    mysql> SELECT * FROM foo;
    +-----+---------+
    | bar | baz     |
    +-----+---------+
    |   1 | afadfa  |
    |   2 | sfasdfa |
    |   3 | asdfadf |
    +-----+---------+
    3 rows in set (0.00 sec)
    

    花园里一切都是美好的!

    现在,有趣的部分!

    mysql> ALTER TABLE foo ENGINE = BLACKHOLE;
    Query OK, 3 rows affected (0.10 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    好的。我们继续INSERT对数据进行如下处理:

    mysql> INSERT INTO foo (baz) VALUES ('xxxxx'), ('yyyyy'), ('zzzzzzz');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    

    再一次,一切都很好,花花公子。数据库很高兴,我们很高兴,最重要的是,第三方软件很高兴并且对环境的任何变化一无所知!

    但!!!现在,当我们这样做时:

    mysql> SELECT * FROM foo;
    Empty set (0.00 sec)
    

    纳达!齐尔奇!瑞恩!没...

    我们的数据已经遇到了黑洞的视界,没有任何东西可以逃脱!您可以根据需要放入尽可能多的数据 - 这就像/dev/null在 *nix 中发送文件!

    您问:

    有没有办法锁定这个日志表,让它永远不会被写入,但同时它会报告写入成功,这样就不会导致软件出现问题?

    现在你有(见上文)外表正常的行为INSERT:

    Query OK, 3 rows affected (0.00 sec)
        Records: 3  Duplicates: 0  Warnings: 0
    

    所以,我们是金!出于所有意图和目的,发送到服务器的数据被忠实地存储,但事实并非如此!

    对于编写这些日志的软件来说,似乎一切都是笨拙的,但没有任何内容被写入——这真的很漂亮。

    这看起来好像是根据您的要求制作的。在 MariaDB 中,您需要按照此处的说明加载插件,但这似乎很简单。从这里:

    应用程序将继续正常运行而不会出现错误。但由于数据从未真正写入,所有额外的 I/O 都消失了。

    只是一个警告!我不知道您的软件是什么将所有这些日志数据写入服务器,但有人,某处,有时认为它值得保存。只要确保你没有把婴儿和洗澡水一起扔出去!

    此外,如果您有这个讨厌的软件的支持合同,您可能想检查一下您是否可能通过这样做使该联系人无效?

    最后一点,如果你在黑洞表上尝试这样的事情:

    INSERT INTO foo (baz) VALUES (23, 'asdfds'), (33), (43, 'adsfd');
    

    结果:

    Column count doesn't match value count at row 1
    

    因此,即使错误是真实的,如果出现错误,您的软件也会按预期运行,并且如果发生这种情况,您的软件将继续(所有外观)正常运行。

    您会注意到小提琴适用于 MySQL 8 而不是 MariaDB。使用 MariaDB(在这个小提琴上),如果我尝试运行,我会收到权限被拒绝错误

    ALTER TABLE foo ENGINE = BLACKHOLE;  
    

    我收到消息:

    Unknown storage engine 'BLACKHOLE'
    

    这是意料之中的——来自 MariaDB 链接:

    在 MariaDB 10.0 之前,默认安装 BLACKHOLE 存储引擎。在 MariaDB 10.1 及更高版本中,必须安装存储引擎的插件。

    尝试更改引擎类型和安装插件都失败了(在面向公众的服务器上几乎不令人惊讶)。

    INSTALL SONAME 'ha_blackhole';
    

    给出:

    INSERT command denied to user
    'fiddle_PIIYJABQHVJRTTYOTJLC'@'localhost' for table 'plugin'
    
    • 4

相关问题

  • 从星期四或一周中的任何其他日子开始,如何通过每周结果改进我的 SQL 语句?

  • **不**在 MySQL 中使用 MEMORY 存储引擎的原因是什么?

  • 加快 MyISAM 到 InnoDB 的转换

  • 使用 Sphinx 存储引擎的优点和缺点是什么?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve