Migrace dat
Skočit na navigaci
Skočit na vyhledávání
Při migraci dat z PostgreSQL 8.1 na 8.3 jsem narazil na problém s fulltextem, který zabraňoval použití pg_dumpall. Nakonec importuji po jednotlivých databázích pomocí následujících skriptů:
# vytvoři dump struktury a dump dat a pro ně simlinky v tmp pg_dumpall -g > users.sqlx ln -s `pwd`/users.sqlx /tmp/migrace/users.sqlx for r in `psql -A -t postgres -c "select datname, quote_ident(datname) from pg_database where datname not in ('template1','template0')";` do BIFS=$IFS IFS="|" ra=($r); echo ${ra[0]} d=${ra[0]} IFS=$BIFS GIFS=$IFS IFS=' ' pg_dump -a -E UTF8 --disable-triggers ${ra[0]} > ${ra[0]}.datax pg_dump -s ${ra[0]} > ${ra[0]}.sqlx ln -s `pwd`/${ra[0]}.datax /tmp/migrace/${ra[0]}.datax ln -s `pwd`/${ra[0]}.sqlx /tmp/migrace/${ra[0]}.sqlx IFS=$GIFS done;
# import vsech sqlx skriptů z adresáře - pro skript zakládá db for r in `ls *.sqlx` do echo "dropdb ${r%.sqlx}" dropdb ${r%.sqlx} createdb ${r%.sqlx} done; echo "import users" psql postgres < users.sqlx for r in `ls *.sqlx` do echo "----- $r ----" cat $r | grep "tsearch2" > /dev/null 2>&1 res=$? if [ $res -eq "0" ]; then echo "import tsearch2" psql ${r%.sqlx} -c '\i /usr/share/pgsql/contrib/tsearch2.sql' fi psql ${r%.sqlx} < $r done;
Importuje všechny datové soubory
#!/bin/bash for r in `ls *.datax` do echo "import data $r" psql ${r%.datax} < $r done;
Dodatečně změní statistiky na 100
# použití - sh statistic.sh | psql postgres for r in `psql -A -t postgres -c "select datname, quote_ident(datname) from pg_database where datname not in ('template1','template0','postgres')";` do BIFS=$IFS IFS="|" ra=($r); echo "\\c ${ra[0]}" d=${ra[0]} IFS=$BIFS GIFS=$IFS IFS=' ' echo "begin;" # change owner of tables, sequences and views for r in `psql -A -t $d -c \\ "select quote_ident(r.rolname), quote_ident(n.nspname) || '.' || quote_ident(c.relname), c.relkind, quote_ident(a.attname) from pg_class c, pg_roles r, pg_namespace n, pg_attribute a where r.oid = c.relowner and n.oid = c.relnamespace and r.rolname not in ('postgres') and c.relkind = 'r' and a.attrelid = c.oid and attnum > 0 and not attisdropped;"`; do BIFS=$IFS IFS="|" ra=($r); echo "ALTER TABLE ${ra[1]} ALTER COLUMN ${ra[3]} SET STATISTICS 100;" IFS=$BIFS done; echo "commit;" IFS=$GIFS done;
S identifikací možných problémů s přetypováním lze použít následující skript, který pro 8.1 (s nutnou úpravou kódu) přepíše obsolete implicitní přetypování přetypováním obsahujícím varování:
CREATE OR REPLACE FUNCTION generator_81_casts() RETURNS void AS $$ DECLARE src varchar[] := '{integer,smallint,oid,date,double precision,real,time with time zone, time without time zone, timestamp with time zone, interval,bigint,numeric,timestamp without time zon\ e}'; fn varchar[] := '{int4out,int2out,oidout,date_out,float8out,float4out,timetz_out,time_out,timestamptz_out,interval_out,int8out,numeric_out,timestamp_out}'; fn_name varchar; fn_msg varchar; fn_body varchar; BEGIN FOR i IN array_lower(src,1)..array_upper(src,1) LOOP fn_name := 'aux_cast_func_' || replace(src[i],' ','_') ||'_to_text'; fn_msg := '''using obsolete implicit casting from ' || src[i] || ' to text'''; fn_body := 'CREATE OR REPLACE FUNCTION '|| fn_name || '(' || src[i] ||') RETURNS text AS $_$ BEGIN RAISE WARNING ' || fn_msg || ';RETURN textin(' || fn[i] || '($1)); END; $_$ LANGUAGE plpgsql IMMUTABLE'; EXECUTE fn_body; -- for 8.1 --EXECUTE 'UPDATE pg_cast SET castfunc = ''' || fn_name || '''::regproc WHERE castsource = ''' || src[i] || '''::regtype AND casttarget = ''text''::regtype'; DROP CAST 'CREATE CAST (' || src[i] || ' AS text)'; EXECUTE 'CREATE CAST (' || src[i] || ' AS text) WITH FUNCTION ' || fn_name || '(' || src[i] || ') AS IMPLICIT'; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; SELECT generator_81_casts();