mysql - 安全写入部分文件算法(原子部分写入)

标签 mysql database postgresql disk acid

假设我要写一个简单的数据库(在linux上工作),必须满足以下条件:

它只有两个功能:

  1. write_chunk(索引,字节)
  2. read_chunk(索引)

其中索引是从0到1M的整数,字节是100字节的 block 。 我希望在每次调用 write_chunk 之后自动传输文件状态。

所以我想确定:

  1. 100 字节 block 写入文件中的位置索引*100
  2. 所有 100 个字节均以原子方式写入(或根本不写入)
  3. 如果写入时突然断电(之前有效的100字节 已恢复)

我想象这样的实现:

编写函数实现:

  1. 在开始写入 100 个字节之前,我们复制前 100 个字节 将索引*100定位到另一个文件以进行回滚(索引也被复制)。 我们还使用哈希对所有回滚文件数据进行签名。在回滚时执行 fsync。
  2. 然后我们开始在位置index*100处写入新的100个字节,执行 fsync。
  3. 如果第 2 步正常,我们将删除回滚文件中的所有数据。
  4. 我们将 ok 返回给函数调用者。

读取函数实现:

  1. 如果我们开始读取并回滚文件不为空且有效,我们 从回滚恢复 100 字节并删除回滚或直接删除 如果哈希无效则回滚。

  2. 我们从位置索引*100读取 block 并返回数据

使用以下算法安全吗?

所以我想确定我与 MySQL 或 PostgreSQL 等数据库处于相同的安全级别在提交后执行插入语句。

我可以使用哪些技术来保证原子和持久写入?我的意思是我可能还需要对 block 使用一些哈希来确保它有效或使用回滚文件的双重副本。或者一次一点地将数据存储在回滚文件中,以确保磁盘子系统刷新。 (我听说即使我在写入后调用 fsync 也不安全,这取决于磁盘子系统,然后它会物理写入数据)。

最佳答案

只要没有并发性,即只允许同时运行这些函数之一,这应该就可以工作。

为什么不使用简单的嵌入式数据库

关于mysql - 安全写入部分文件算法(原子部分写入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581747/

相关文章:

PHP/MYSQLi SQL SELECT 在多个表上并将结果作为 json 对象返回

php - 有没有办法用 Zend_Db_Adapter 检索 SHOW WARNINGS 的输出?

php - 无法使用PHP表单登录,但没有显示错误;字段已清除

用于存储构建版本的 SQL 数据类型

javascript - 节点 Postgres Pub/Sub - 保留剩余的连接槽

mysql - 如果 MySQL CONCAT_WS 中所有值均为 NULL,如何删除分隔符?

php - 在 MySQL 查询中插入 "&"或 "%"等字符

java - JDBC 第一次访问异常

java - Postgresql JDBC 表值参数

sql - 使用 Postgres 9.5 GIN 索引和 JSONB