sql >> データベース >  >> RDS >> PostgreSQL

90日より古いテーブルとインデックスを自動的に削除します

    補足/免責事項:
    テーブルの作成時間は100%信頼できるわけではないため、これは悪い考えです。これは、CLUSTERなどのテーブルの操作により、テーブルが内部で削除されて再作成された可能性があるためです。

    それとは別に、次のように作成時間を取得できます(example-table-nameのt_benutzerを想定) ):

    --select datname, datdba from pg_database;
    --select relname, relfilenode from pg_class where relname ilike 't_benutzer';
    
        -- (select relfilenode::text from pg_class where relname ilike 't_benutzer')
    
    
    
    
    SELECT 
        pg_ls_dir
        ,
        (
            SELECT creation
            FROM pg_stat_file('./base/'
                ||
                (
                        SELECT 
                            MAX(pg_ls_dir::bigint)::text 
                        FROM pg_ls_dir('./base') 
                        WHERE pg_ls_dir <> 'pgsql_tmp' 
                        AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
                )
                || '/' || pg_ls_dir
            )
        ) as createtime 
    FROM pg_ls_dir(
        './base/' || 
        (
            SELECT 
                MAX(pg_ls_dir::bigint)::text 
            FROM pg_ls_dir('./base') 
            WHERE pg_ls_dir <> 'pgsql_tmp' 
            AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer') 
        ) 
    ) 
    
    WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
    

    秘訣は、それぞれのテーブルファイルでpg_stat_fileを使用することです。

    -- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum
    
    
    select 
        pg_ls_dir
        , 
        (
            select 
                --size 
                --access
                --modification 
                --change
                creation 
                --isdir
            from pg_stat_file(pg_ls_dir)
        ) as createtime 
    from pg_ls_dir('.'); 
    

    この投稿のコメントによると、 PostgreSQL:テーブルの作成時間 CLUSTERなどのテーブルの操作により、テーブルが内部的に削除されて再作成された可能性があるため、これは100%信頼できるわけではありません。

    また、パターン

    /main/base/<database id>/<table filenode id> 
    

    私のマシンでは、異なるデータベースのすべてのテーブルのデータベースIDが同じであり、フォルダが任意のiノード番号に置き換えられているように見えるため、テーブルの番号に最も近い番号のフォルダを見つける必要があります。 iノードID(folderid <=table_inode_idおよびfoldernameが数値である最大foldername)

    簡略化されたバージョンは次のようになります:

    SELECT creation 
    FROM pg_stat_file(
        './base/'
        ||
        (
            SELECT 
            MAX(pg_ls_dir::bigint)::text 
            FROM pg_ls_dir('./base') 
            WHERE pg_ls_dir <> 'pgsql_tmp' 
            AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
        )
        || '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
    )
    

    次に、information_schemaとcteを使用してクエリを単純にするか、独自のビューを作成できます。

    ;WITH CTE AS
    (
        SELECT 
            table_name 
    
            ,
            (
                SELECT 
                    MAX(pg_ls_dir::bigint)::text 
                FROM pg_ls_dir('./base') 
                WHERE pg_ls_dir <> 'pgsql_tmp' 
                AND  pg_ls_dir::bigint  <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
            ) as folder 
    
            
            ,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
            
        FROM information_schema.tables
        WHERE table_type = 'BASE TABLE'
        AND table_schema = 'public'
    )
    
    SELECT 
        table_name 
        ,(
            SELECT creation 
            FROM pg_stat_file(
                './base/' || folder || '/' || filenode 
            )
        ) as creation_time
    FROM CTE 
    

    (nhibernateスキーマで作成されたすべてのテーブルが作成されるため、スクリーンショットのすべてのテーブルでほぼ同時に正しいです)。

    リスクと副作用については、脳を使用するか、医師または薬剤師に相談してください;)



    1. MySQL 5、シンプルメンバーシッププロバイダー、EntityFramework5でのASP.NETMVC4の使用

    2. 書痙なしで、1つまたは2つのフィールドを除いて、すべてを選択できますか?

    3. SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfoが失敗しました:名前またはサービスが不明です

    4. パラメータ varbinary データ型にヌル値があります