在 postgres sql 中试图在一个短时间内删除 10000 个表时从共享内存中获取错误增加 max_locks_per_transaction
While trying to drop 10000 tables in one short in postgres sql getting error out of shared memory increase max_locks_per_transaction
共享内存不足提示:您可能需要增加
max_locks_per_transaction。
我们以逗号分隔 tables table_names 的形式传递输入,并试图删除一个巨大的
一组 table
CREATE OR REPLACE FUNCTION "Schema".drop_tables(table_names character varying
RETURNS void AS
$BODY$
DECLARE tables text[];
DECLARE table_name VARCHAR;
BEGIN
SET search_path='Schema';
SELECT into tables string_to_array(table_names,',');
FOREACH table_name IN ARRAY tables
LOOP
EXECUTE format('DROP TABLE %I', table_name);
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "Schema".drop_tables(character varying)
OWNER TO postgres;
当我通过 1000 table 秒时它运行良好,但当我通过 10000 table 秒时它会抛出错误。
它只是抛出异常以增加 max_locks_per_transaction
该功能可用的最大锁数是多少?有什么办法
计算我们应该增加多少
max_locks_per_transaction value 默认值为64.
删除 table 需要对 table、其所有索引和 TOAST table 及其索引(如果存在)进行 ACCESS EXCLUSIVE
锁定。此类锁存储在共享内存锁 table 中,其中有 max_connections * max_locks_per_transaction
个条目的空间。锁一直持有到事务结束,函数总是在单个事务中执行。
因此,如果您需要超过默认的 6400 个锁定 table 条目来删除所有 table,请增加参数或将操作分布在多个数据库事务中。
共享内存不足提示:您可能需要增加 max_locks_per_transaction。 我们以逗号分隔 tables table_names 的形式传递输入,并试图删除一个巨大的 一组 table
CREATE OR REPLACE FUNCTION "Schema".drop_tables(table_names character varying
RETURNS void AS
$BODY$
DECLARE tables text[];
DECLARE table_name VARCHAR;
BEGIN
SET search_path='Schema';
SELECT into tables string_to_array(table_names,',');
FOREACH table_name IN ARRAY tables
LOOP
EXECUTE format('DROP TABLE %I', table_name);
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "Schema".drop_tables(character varying)
OWNER TO postgres;
当我通过 1000 table 秒时它运行良好,但当我通过 10000 table 秒时它会抛出错误。 它只是抛出异常以增加 max_locks_per_transaction 该功能可用的最大锁数是多少?有什么办法 计算我们应该增加多少 max_locks_per_transaction value 默认值为64.
删除 table 需要对 table、其所有索引和 TOAST table 及其索引(如果存在)进行 ACCESS EXCLUSIVE
锁定。此类锁存储在共享内存锁 table 中,其中有 max_connections * max_locks_per_transaction
个条目的空间。锁一直持有到事务结束,函数总是在单个事务中执行。
因此,如果您需要超过默认的 6400 个锁定 table 条目来删除所有 table,请增加参数或将操作分布在多个数据库事务中。