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();