1. ホーム
  2. mysql

[解決済み] 宣言にDETERMINISTIC、NO SQL、またはREADS SQL DATAがあり、バイナリログが有効である。

2022-04-24 03:48:32

質問

mysqlでデータベースをインポートする際に、以下のエラーが発生しました。

1418 (HY000) at line 10185: 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_function_creators variable)

どの部分を変更すればいいのかわかりません。どなたか解決方法を教えていただけませんか?

どのように解決するのですか?

修正方法は2つあります。

  1. MySQLコンソールで以下を実行する。

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. mysql.iniの設定ファイルに以下を追加します。

    log_bin_trust_function_creators = 1;

非決定性関数に対するチェックを緩和する設定です。非決定性関数とは、データを変更する(つまり、update、insert、deleteステートメントを持つ)関数を指します。詳しくは、以下を参照してください。 こちら .

バイナリログが有効でない場合、この設定は適用されませんのでご注意ください。

ストアドプログラムのバイナリログ

バイナリログが有効でない場合、log_bin_trust_function_creatorsは有効ではありません。 は適用されません。

log_bin_trust_function_creators

この変数は、バイナリロギングが有効な場合に適用されます。

最良の方法は、ストアド関数の決定論的宣言をよりよく理解し、使用することです。これらの宣言は MySQL によってレプリケーションを最適化するために使用され、健全なレプリケーションを行うためにこれらを慎重に選択することは良いことです。

ディタミニスティック ルーチンは、同じ入力パラメータに対して常に同じ結果を生成する場合、「決定論的」とみなされ、そうでない場合は「決定論的でない」とみなされます。 これは主に文字列や数学の処理で使われますが、それに限定されるものではありません。

非決定論的 DETERMINISTIC"の反対語。 "。 ルーチン定義で DETERMINISTIC も NOT DETERMINISTIC も指定されていない場合、デフォルトは NOT DETERMINISTIC です。関数が決定論的であることを宣言するには、DETERMINISTIC を明示的に指定する必要があります。 "です。 つまり、何も記述しなければ、MySQlはその関数を "NOT DETERMINISTIC" として処理するようです。 このマニュアルの記述は、マニュアルの別の場所にある他の記述と矛盾しています。 " ストアド関数を作成する際には、決定論的であること、またはデータを変更しないことを宣言する必要があります。そうでなければ、データ復旧やレプリケーションの際に安全でない可能性があります。 デフォルトでは、CREATE FUNCTION文が受け入れられるためには、DETERMINISTIC、NO SQL、READS SQL DATAのうち少なくとも1つが明示的に指定されていなければなりません。そうでない場合はエラーが発生します。 "です。

個人的にはMySQL5.5では宣言がないとエラーになるので、他の宣言があっても最低1つは"DETERMINISTIC" "NOT DETERMINISTIC" "NO SQL" "READS SQL DATA" という宣言を入れてますね。

READS SQL DATA したがって、データを修正する命令は含まず、データを読み込む SQL 命令(例:SELECT)を含めます。

sqlデータを変更する これは、ルーチンにデータを書き込む可能性のあるステートメントが含まれていることを示します(例えば、UPDATE、INSERT、DELETE、ALTER命令が含まれます)。

SQLなし これは、ルーチンに SQL 文が含まれていないことを示します。

CONTAINS SQL これは、ルーチンに SQL 命令が含まれているが、データの読み取りまたは書き込みを行うステートメントが含まれていないことを示します。これらの特性のいずれも明示的に指定されていない場合、これは既定値です。このような文の例としては、SELECT NOW(), SELECT 10+@b, SET @x = 1, DO RELEASE_LOCK('abc') などがあり、これらは実行されますがデータの読み取りや書き込みは行いません。

など、決定論的安全でないMySQL関数があることに注意してください。NOW()、UUID() などの決定論的安全ではない MySQL 関数があり、これらはマシンによって異なる結果をもたらす可能性があるため、そのような命令を含むユーザ関数は NOT DETERMINISTIC として宣言する必要があります。 また、複製されていないスキーマからデータを読み取る関数は、明らかにNONDETERMINISTICです。

ルーチンの性質の評価は、その人の「正直さ」に基づいています。 の作成者です。MySQL は、DETERMINISTIC と宣言されたルーチンが次のようなものであるかどうかをチェックしません。 非決定的な結果をもたらすステートメントがないこと。しかし ルーチンの宣言を誤ると、結果に影響を与えたり、性能に影響を与える可能性があります。 非決定的なルーチンを DETERMINISTIC と宣言すると、結果や性能に影響する可能性があります。 オプティマイザが不正確な処理を行い、予期せぬ結果を招くことがあります。 実行計画を選択します。決定論的ルーチンを NONDETERMINISTICは、利用可能なすべての機能を提供し、パフォーマンスを低下させる可能性があります。 最適化が使用されない。