|
|
|
@ -14,7 +14,27 @@ |
|
|
|
-- limitations under the License. |
|
|
|
-- |
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS tmp_audit_log ( |
|
|
|
DO |
|
|
|
$$ |
|
|
|
DECLARE table_partition RECORD; |
|
|
|
BEGIN |
|
|
|
-- in case of running the upgrade script a second time: |
|
|
|
IF NOT (SELECT exists(SELECT FROM pg_tables WHERE tablename = 'old_audit_log')) THEN |
|
|
|
ALTER TABLE audit_log RENAME TO old_audit_log; |
|
|
|
ALTER INDEX IF EXISTS idx_audit_log_tenant_id_and_created_time RENAME TO idx_old_audit_log_tenant_id_and_created_time; |
|
|
|
|
|
|
|
FOR table_partition IN SELECT tablename AS name, split_part(tablename, '_', 3) AS partition_ts |
|
|
|
FROM pg_tables WHERE tablename LIKE 'audit_log_%' |
|
|
|
LOOP |
|
|
|
EXECUTE format('ALTER TABLE %s RENAME TO old_audit_log_%s', table_partition.name, table_partition.partition_ts); |
|
|
|
END LOOP; |
|
|
|
ELSE |
|
|
|
RAISE NOTICE 'Table old_audit_log already exists, leaving as is'; |
|
|
|
END IF; |
|
|
|
END; |
|
|
|
$$; |
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS audit_log ( |
|
|
|
id uuid NOT NULL, |
|
|
|
created_time bigint NOT NULL, |
|
|
|
tenant_id uuid, |
|
|
|
@ -29,21 +49,7 @@ CREATE TABLE IF NOT EXISTS tmp_audit_log ( |
|
|
|
action_status varchar(255), |
|
|
|
action_failure_details varchar(1000000) |
|
|
|
) PARTITION BY RANGE (created_time); |
|
|
|
CREATE INDEX IF NOT EXISTS idx_tmp_audit_log_tenant_id_and_created_time ON tmp_audit_log(tenant_id, created_time DESC); |
|
|
|
|
|
|
|
CREATE OR REPLACE PROCEDURE rename_old_audit_logs_partitions() |
|
|
|
LANGUAGE plpgsql AS |
|
|
|
$$ |
|
|
|
DECLARE |
|
|
|
table_partition RECORD; |
|
|
|
BEGIN |
|
|
|
FOR table_partition IN SELECT tablename AS name, split_part(tablename, '_', 3) AS partition_ts |
|
|
|
FROM pg_tables WHERE tablename LIKE 'audit_log_%' |
|
|
|
LOOP |
|
|
|
EXECUTE format('ALTER TABLE %s RENAME TO old_audit_log_%s', table_partition.name, table_partition.partition_ts); |
|
|
|
END LOOP; |
|
|
|
END; |
|
|
|
$$; |
|
|
|
CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time DESC); |
|
|
|
|
|
|
|
CREATE OR REPLACE PROCEDURE migrate_audit_logs(IN start_time_ms BIGINT, IN end_time_ms BIGINT, IN partition_size_ms BIGINT) |
|
|
|
LANGUAGE plpgsql AS |
|
|
|
@ -52,17 +58,17 @@ DECLARE |
|
|
|
p RECORD; |
|
|
|
partition_end_ts BIGINT; |
|
|
|
BEGIN |
|
|
|
FOR p IN SELECT DISTINCT (created_time - created_time % partition_size_ms) AS partition_ts FROM audit_log |
|
|
|
FOR p IN SELECT DISTINCT (created_time - created_time % partition_size_ms) AS partition_ts FROM old_audit_log |
|
|
|
WHERE created_time >= start_time_ms AND created_time < end_time_ms |
|
|
|
LOOP |
|
|
|
partition_end_ts = p.partition_ts + partition_size_ms; |
|
|
|
RAISE NOTICE '[audit_log] Partition to create : [%-%]', p.partition_ts, partition_end_ts; |
|
|
|
EXECUTE format('CREATE TABLE IF NOT EXISTS audit_log_%s PARTITION OF tmp_audit_log ' || |
|
|
|
EXECUTE format('CREATE TABLE IF NOT EXISTS audit_log_%s PARTITION OF audit_log ' || |
|
|
|
'FOR VALUES FROM ( %s ) TO ( %s )', p.partition_ts, p.partition_ts, partition_end_ts); |
|
|
|
END LOOP; |
|
|
|
|
|
|
|
INSERT INTO tmp_audit_log |
|
|
|
SELECT * FROM audit_log |
|
|
|
INSERT INTO audit_log |
|
|
|
SELECT * FROM old_audit_log |
|
|
|
WHERE created_time >= start_time_ms AND created_time < end_time_ms; |
|
|
|
END; |
|
|
|
$$; |
|
|
|
|