我需要加密MySQL slave上的一些数据并使用AES_Encrypt进行加密。是否可以在从Master数据库复制它时加密它?
使用MySQL 5.6
答案 0 :(得分:0)
在MySQL复制中,当使用binlog_format=STATEMENT
时,触发器会在主设备上再次触发,但是没有特定要求触发器在主设备和从设备上相同地定义,或触发器设置在两者。
我说没有特定的要求,因为它没有强制执行。如果您希望数据在主服务器和从服务器上相同 - 在复制环境中几乎总是如此 - 那么是的,必须在两台服务器上相同地定义触发器......但是可以自定义从服务器触发器 - 并且一种方法是在插入和更新之前在从属服务器上定义BEFORE INSERT
和BEFORE UPDATE
触发器。
这确实需要STATEMENT
复制,我不会使用它,因为它更加精细,某些语句无法在STATEMENT
模式下被确定性地复制。
这需要特别小心以确保主服务器和从服务器始终保持一致,并且需要自定义工具,因为标准表比较工具会认为主表和从表不同。
对于binlog_format=ROW
,从属服务器上定义的任何触发器都会被复制事件忽略,因为它们是冗余的 - 主服务器上的触发器所做的更改将作为行事件复制到从服务器,并且在从站上执行触发器将无法获得正确的结果。基于行的复制使用原始行图像,因此与基于语句的复制不同,因此总是具有确定性。
MariaDB团队认识到可能存在相同数据集不是目标的情况,例如您可能希望在从属服务器上构建非规范化查询表的位置,因此在MariaDB 10.1中,他们引入了一个允许从属服务器启动的功能触发基于行的事件。如果您的主服务器不使用基于语句的复制,这也可能是一个可行的解决方案。它似乎不需要主服务器运行MariaDB,只运行从服务器。
https://mariadb.com/kb/en/mariadb/running-triggers-on-the-slave-for-row-based-events/
还可以创建无法访问所有列的帐户,因为MySQL权限模型允许在服务器,数据库,表和列级别进行授权。未经许可访问某个列,即使它存在,您也不会看到它。
但可以说,如果数据是敏感的,那么最正确的解决方案就是在主数据上对其进行加密。