ablog

不器用で落着きのない技術者のメモ

MySQL で移行時のオブジェクトのステータスチェックについて

MySQL の プロシージャやファンクションは SHOW FUNCTION STATUS や information_schema.routines で確認できるけど、Oracle みたいにステータスが invalid とかは気にしなくてよさそう。
https://dev.mysql.com/doc/refman/5.7/en/information-schema-routines-table.html

yohei.az on Twitter: "MySQL の プロシージャやファンクションは SHOW FUNCTION STATUS や information_schema.routines で確認できるけど、Oracle みたいにステータスが invalid とかは気にしなくてよさそう。 https://t.co/zAcizAxpMv"

一応コンパイル済みのルーティンをキャッシュしてるんですが、キャッシュされてるルーティンが参照してるオブジェクトが消えたとかは検知してくれないですね。基本的に実行時コンパイル/実行時チェックなので、実行時エラーでキャッチするしかないという理解です。

Indigo on Twitter: "一応コンパイル済みのルーティンをキャッシュしてるんですが、キャッシュされてるルーティンが参照してるオブジェクトが消えたとかは検知してくれないですね。基本的に実行時コンパイル/実行時チェックなので、実行時エラーでキャッチするしかないという理解です。… "

あざます!RDS MySQL から Aurora MySQL にリードレプリカで移行する場合に、切替時にチェックすべき観点として必要か調べてたのですが、移行元と移行先で全オブジェクトを比較すればよさそうですね。

yohei.az on Twitter: "あざます!RDS MySQL から Aurora MySQL にリードレプリカで移行する場合に、切替時にチェックすべき観点として必要か調べてたのですが、移行元と移行先で全オブジェクトを比較すればよさそうですね。… "

基本的にオブジェクトがちゃんとすべて移行されてれば定義が同じなら問題ないですね。だいたいのケースではレプリケーションば OK にしちゃってましたが。RDS/Aurora だと使い方がちょっとトリッキーになっちゃいますが pt-table-checksum 使ったケースもありました。

Indigo on Twitter: "基本的にオブジェクトがちゃんとすべて移行されてれば定義が同じなら問題ないですね。だいたいのケースではレプリケーションば OK にしちゃってましたが。RDS/Aurora だと使い方がちょっとトリッキーになっちゃいますが pt-table-checksum 使ったケースもありました。… https://t.co/lYKazxH2QD"

こんにちは、平塚と言います。

2015年3月2日 10:40 :

> MySQLoracleのようにinvalid objectを確認する方法はありますか?
>
>

効率的に確認する方法は、ないと思います。

■プロシージャの場合

(1) プロシージャを定義して実行

DROP PROCEDURE IF EXISTS test_invalid;
DELIMITER //
CREATE PROCEDURE test_invalid() DETERMINISTIC
BEGIN
  SELECT ename FROM emp WHERE empno = 7788;
END
//
DELIMITER ;

CALL test_invalid();

+-------+
| ename |

+-------+
| scott |

+-------+

(2) テーブル名を変更

ALTER TABLE emp RENAME emp_renamed;

(3) プロシージャを実行するとエラー

CALL test_invalid();
ERROR 1146 (42S02): Table 'scott.emp' doesn't exist

■ビューの場合

(1) ビューを定義して参照

CREATE VIEW emp_view AS SELECT * FROM emp;
SELECT * FROM emp_view;

(SELECT結果は省略)

(2) テーブル名を変更

ALTER TABLE emp RENAME emp_renamed;

(3) ビューを参照するとエラー

SELECT * FROM emp_view;
ERROR 1356 (HY000): View 'scott.emp_view' references invalid table(s) or
column(s) or function(s) or definer/invoker of view lack rights to use them

Oracle DatabaseではDBA/ALL/USER_OBJECTSでINVALID列を確認することにより
(2)と(3)の間で事前にチェックをかけることができます。

MySQLでは私の把握する限りそのような仕組みはないです。
プロシージャでしたら動作確認する、ビューでしたらSELECT文を実行してみる
必要があると思います。

mysql:16218