Este es muy parecido a la entrada anterior, solo que en vez de eliminar las tablas las deja limpias.
esto lo hago para luego cargar en la base de datos un respaldo sin que alguna tabla interrumpa la carga por tener datos previos.
Para ello realizo el respado con la siguiente instrucción:
<
sudo -u postgres pg_dump -a -Fp --exclude-table=field1 --exclude-table=field2 -v basedata_name > ~/Documentos/Respaldo_DB/dbbackup.sql
>
~/ me lleva directo al /home/usuario
<
DO
$$
DECLARE
v_table VARCHAR;
v_sql_string VARCHAR;
v_exclude_table VARCHAR[] := ARRAY['spatial_ref_sys', 'geometry_columns'];
v_include_table VARCHAR[];
v_i INTEGER;
v_num INTEGER;
BEGIN
SELECT INTO v_num count(relname)
FROM pg_class c
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(v_exclude_table) AND
nsp.nspname = 'public'
AND relhasindex = 't';
v_include_table := ARRAY(SELECT c.relname
FROM (
SELECT pg_constraint.confrelid, COUNT(confrelid) as total FROM pg_constraint, pg_class WHERE
pg_class.oid = pg_constraint.conindid
GROUP BY pg_constraint.confrelid
) AS rest
RIGHT JOIN pg_class c ON rest.confrelid = c.oid
JOIN pg_namespace nsp ON c.relnamespace = nsp.oid
WHERE c.relname <> ALL(v_exclude_table) AND
nsp.nspname = 'public'
AND relhasindex = 't'
ORDER BY
CASE WHEN rest.total IS NULL THEN 0 END, rest.total);
FOR v_i IN 1..v_num
LOOP
v_sql_string := 'TRUNCATE TABLE ' || v_include_table[v_i] || ' CASCADE';
EXECUTE v_sql_string;
RAISE NOTICE 'Table %s Truncate',v_include_table[v_i];
END LOOP;
END
$$
>
restauro la base de datos de la siguiente forma:
<
sudo -u postgres psql basedata_name < ~/dbbackup.sql > dbackup.log
>
dbackup.log contiene un log de la ejecución del comando.
No hay comentarios:
Publicar un comentario