web-dev-qa-db-ja.com

redshiftでテーブルの作成日を見つける方法はありますか?

AmazonRedshiftでテーブルの作成日を見つけるのに問題があります。 svv_table_infoがテーブルに関するすべての情報を提供しますが、作成日はわかります。誰か助けてもらえますか?

8
Kamlesh Gallani

Redshiftの他の方法では、svl_qlogで実行されているcreate table sqlの開始時刻と停止時刻を検索することにより、テーブルの作成時刻を取得できます。同様のデータを取得するために確認できるテーブルは他にもありますが、この方法の問題は、数日間(3〜5)しか保持されないことです。誰もがテーブル自体と一緒に保存されたメタデータにクエリを実行したいと思っていますが。 Amazonは、このデータを保持して、保持するログからS3にデータをエクスポートすることをお勧めします。次に、私の意見では、これらのs3ファイルをaws_table_historyなどと呼ばれる永続的なテーブルにインポートして戻し、この特別なデータを永久に保持することができます。

select * from svl_qlog where substring ilike 'create table%' order by starttime desc limit 100;

select * from stl_query a, stl_querytext b where a.query = b.query and b.text ilike 'create table%' order by a.starttime desc limit 100; 

または、次のようにテーブル名と日付だけを取得します。

select split_part(split_part(b.text,'table ', 2), ' ', 1) as tablename, 
starttime as createdate 
from stl_query a, stl_querytext b 
where a.query = b.query and b.text ilike 'create table%' order by a.starttime desc;

必要なテーブル作成データ履歴を、キーを使用して作成したS3バケットにエクスポートします。以下のselectステートメントは、作成されたテーブル名と作成された日時を出力します。

S3にエクスポートするデータを使用して一時テーブルを作成します。

create table temp_history as 
(select split_part(split_part(b.text,'table ', 2), ' ', 1) as tablename, starttime as createdate 
from stl_query a, stl_querytext b 
where a.query = b.query 
and b.text ilike 'create table%' order by a.starttime desc);

次に、このテーブルをS3にアップロードします。

unload ('select * from temp_history') 
to 's3://tablehistory' credentials 'aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretkey' 
DELIMITER '|' NULL AS '' ESCAPE ALLOWOVERWRITE;

AWSRedshiftで新しいテーブルを作成します。

CREATE TABLE aws_table_history
(
tablename VARCHAR(150),
createdate DATETIME
);

次に、それをカスタムテーブルにインポートして戻します。

copy aws_table_history from 's3://tablehistory' credentials 'aws_access_key_id=MYKEY;aws_secret_access_key=MYID'
emptyasnull
blanksasnull
removequotes
escape
dateformat 'YYYY-MM-DD'
timeformat 'YYYY-MM-DD HH:MI:SS'
maxerror 20;
delimiter '|';

私はこれをすべてテストしました、そしてそれは私たちのために働きます。これが一部の人々に役立つことを願っています。最後に、より簡単な方法は、Talend Big Data Open Studioを使用して新しいジョブを作成し、コンポーネントtRedshiftRowを取得して、それに次のSQLを貼り付けることです。次に、ジョブをビルドすると、任意の環境で.bat(windows)または.sh(unix)を実行するようにスケジュールできます。

INSERT INTO temp_history 
(select split_part(split_part(b.text,'table ', 2), ' ', 1) as tablename, starttime as createdate 
from stl_query a, stl_querytext b 
where a.query = b.query 
and b.text ilike 'create table%' order by a.starttime desc);
COMMIT;
insert into historytable
select distinct s.* 
from temp_history s;
COMMIT;
--remove  duplicates 
DELETE FROM historytable USING historytable a2 
WHERE historytable.tablename = a2.tablename AND
historytable.createdate < a2.createdate;
COMMIT;
---clear everything from prestage
TRUNCATE temp_history;
COMMIT;
10
Mark Lane

Redshiftでテーブルの作成タイムスタンプを取得する方法がないようです。回避策の1つは、CREATE TABLEを含むDDLの履歴を記録するSTL_DDLTEXTテーブルを使用することです。

次に例を示します(test_tableはテーブル名です)。

dev=> select starttime, endtime, trim(text) as ddl from stl_ddltext where text ilike '%create%table%test_table%' order by endtime desc limit 1;
         starttime          |          endtime           |                                                               ddl
----------------------------+----------------------------+----------------------------------------------------------------------------------------------------------------------------------
 2016-04-25 05:38:11.666338 | 2016-04-25 05:38:11.674947 | CREATE TABLE "test_table" (id int primary key, value varchar(24));
(1 row)

上記の場合、starttimeまたはendtimetest_tableテーブル作成のタイムスタンプになります。

注:

  • RedshiftはSTL_DDLTEXTを長期間保持しないなので、この方法を永続的に使用することはできません。
  • テーブル名の名前変更などの他の方法でテーブルが作成されている場合は、この方法を使用できません。
3