mysql - MySQL主从复制期间数据的AES加密

标签 mysql aes database-replication

我需要加密 MySQL 从站上的一些数据并使用 AES_Encrypt 进行加密。是否可以在从主数据库复制它时对其进行加密?

使用MySQL 5.6

最佳答案

在 MySQL 复制中,使用 binlog_format=STATMENT 时,触发器会在主服务器上触发,然后在从服务器上再次触发,但没有具体要求触发器在主服务器和从服务器上定义相同,或者在两者上配置触发器。

我说没有具体要求,因为它没有强制执行。如果您希望主服务器和从服务器上的数据相同(在复制环境中几乎总是如此),那么是的,必须在两台服务器上定义相同的触发器...但是可以自定义从服务器触发器——一种方法是在从属设备上定义 BEFORE INSERTBEFORE UPDATE 触发器,在插入和更新之前对列进行加密。

这确实需要 STATMENT 复制,但我不使用它,因为它更微妙,并且某些语句无法在 STATMENT 模式下确定性地复制。

这需要额外小心,以确保主表和从表始终一致,并且需要自定义工具,因为标准表比较工具会认为主表和从表不同。

<小时/>

使用binlog_format=ROW,对于复制的事件,在从站上定义的任何触发器都会被忽略,因为它们是多余的——主站上触发器所做的更改已经被复制到从站作为行事件,并且在从属设备上执行触发器不会得到正确的结果。基于行的复制使用原始行图像,因此始终是确定性的,与基于语句的复制不同。

MariaDB 团队认识到,在某些情况下,相同的数据集可能不是目标,例如您可能希望在从属设备上构建非规范化查询表,因此在 MariaDB 10.1 中,他们引入了一项允许从属设备启动的功能基于行的事件的触发器。如果您的主服务器不使用基于语句的复制,这也可能是一个可行的解决方案。它似乎不需要主服务器运行 MariaDB,只需要从服务器。

https://mariadb.com/kb/en/mariadb/running-triggers-on-the-slave-for-row-based-events/

<小时/>

还可以创建无法访问所有列的帐户,因为 MySQL 权限模型允许在服务器、数据库、表和列级别进行授权。如果没有访问列的权限,您将看不到它,尽管它在那里。

<小时/>

不过,可以说,如果数据敏感,最正确的解决方案是在主服务器上对其进行加密。

关于mysql - MySQL主从复制期间数据的AES加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35599539/

相关文章:

java - 开放声明中的这个错误是什么?

Java AES GCM javax.crypto.AEADBadTagException : Tag mismatch

node.js - "ERROR while connecting to database. Error: Error: No valid replicaset instance servers found"

php - MySQL:如果所有值都存在则返回真

php - 十六进制输入是否足以清理 SQL 查询?

mysql - 在SQL(ORACLE)中将数据从旧表复制到新表

php - POST 到 mysql 时希腊字符编码不正确

c - 如何在 armv7 架构中构建 mcrypt 库?

postgresql - 什么是 postgresql 复制的主机故障

MYSQL同步/数据从多个数据库插入到单个目标数据库