Migrace dat

Z PostgreSQL
Přejít na: navigace, hledá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();