代码改变世界

mysqldump最佳实践(2)

2023-01-26 12:00  abce  阅读(334)  评论(0编辑  收藏  举报

​导入存储过程、函数和触发器

默认情况下,mysqldump导入视图和触发器。但是,它不导入过程、函数和事件。要导入过程和函数,应该指定--routines选项,要导入事件,应该指定--events选项。

1.导入触发器

mysqldump默认情况下尝试转储数据库中的所有触发器。为了能够转储表的触发器,必须具有表的TRIGGER特权。如果dump用户没有这个权限,触发器将被跳过,mysqldump将不会抛出任何错误。因此,如果没有看到任何触发器导入到目标数据库,请不要感到惊讶。

2.导入事件

要导入事件,在调用mysqldump时需要指定--events选项。该选项需要这些数据库的EVENT特权。同样,如果转储用户没有这些权限,mysqldump将静默跳过事件,即使你在调用mysqldump时指定了--events选项。

3.导入函数和存储过程

要导入routines,在调用mysqldump时需要指定--routines选项。该选项需要global select权限。即使在这种情况下,如果转储用户没有这些权限,mysqldump也会无声地跳过函数和过程,即使你在调用mysqldump时指定了--routines选项。

3.1导入非确定性函数

修改数据的存储程序如果不能产生可重复的结果,则称为非确定性程序。例如rand()函数。在复制设置中使用此类函数尤其具有挑战性,因为它们可能导致源和副本上的数据不同。为了控制这种可能性,MySQL在启用二进制日志时对函数创建施加了某些限制。

默认情况下,CREATE FUNCTION语句,必须显式指定deterministic、no sql或reads sql data中的至少一个。否则将发生错误:

ERROR 1418 (HY000) at line 181: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_funable)

因此,如果函数在源上没有声明为deterministic 的,并且在目标库上启用了二进制日志记录,那么在转储恢复期间将看到上述错误。因此,提前了解函数的确定性性质是很重要的。如果您确信函数是确定性的,那么在恢复操作之前,需要在目标上打开log_bin_trust_function_creators配置。启用后,MySQL即使启用了二进制日志记录,也允许创建这样的函数。

4.stored routines和视图的SQL安全特性。

MySQL允许在创建存储程序或视图时指定sql security上下文。sql security可以指定为definer或invoker。

如果sql_security上下文是definer,则routines使用routines definer子句中命名的帐户的特权执行。如果上下文是invoker,routines将使用调用它的用户的特权执行。默认值为definer。

如果要恢复routines或视图,则需要确保目标数据库中存在定义者用户帐户,并具有适当的授权。否则在恢复过程中会遇到失败。

让我们用一个与视图相关的示例来演示这一点。

让我们假设你有视图v1和v2定义如下:

CREATE definer=admin@'%'V1 AS SELECT * FROM solution_table;
CREATE definer=admin@'%'SELECT * FROM V1 where num1=10;

请注意,视图在默认情况下被mysqldump转储,如果你的目标用户不是'admin',你将在恢复操作期间遇到以下错误:

Command failed with error - ERROR 1449 (HY000) at line 206 in file: '/mysql_data/mysqldump/sqldump_1582457155758.sql': The user specified as a definer ('admin'@'%') does not exist.

注意,仅仅确保用户存在是不够的,用户还需要有适当的权限来执行视图。例如,如果目标用户admin@'%'存在,但在mydb数据库上没有SELECT权限,将看到一条错误消息:

'/mysql_data/mysqldump/sqldump_1582456858033.sql':View 'mydb.V2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them.