It is currently Sat Feb 11, 2012 12:10 pm

All times are UTC + 2 hours




Post new topic Reply to topic  [ 14 posts ] 
Author Message
 Post subject: backup?!
PostPosted: Sun Nov 29, 2009 3:17 am 
Offline

Joined: Thu Nov 05, 2009 1:37 pm
Posts: 146
Location: Russia, Saint-Petersburg
Кто как делает бекап?!
Пробовал стандартно, через меню "файл"-"БД"-"бакап" --- хрен, дает файл 0байтов размером!
Попробывал через pgadmin, сдесь я дублировать пробывал.
Ну что бы уже начать внедрять и паралельно заниматься тестированием, но не каждый раз же делать бд заного(т.е. партнеров, настройки...)
Но хрен! оно сказало нехрен выпендриваться и проигнорировалло!

Расскажите, пжл, как дублировать и бекапить бд?


Top
 Profile  
 
 Post subject: Re: backup?!
PostPosted: Sun Nov 29, 2009 12:01 pm 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
alukard404 wrote:
Кто как делает бекап?!
Пробовал стандартно, через меню "файл"-"БД"-"бакап" --- хрен, дает файл 0байтов размером!
Попробывал через pgadmin, сдесь я дублировать пробывал.
Ну что бы уже начать внедрять и паралельно заниматься тестированием, но не каждый раз же делать бд заного(т.е. партнеров, настройки...)
Но хрен! оно сказало нехрен выпендриваться и проигнорировалло!

Расскажите, пжл, как дублировать и бекапить бд?


Пока только утилитами postgresql - pg_dump, pg_restore,
Сейчас смотрю в чем глюк у них (они используют эти утилиты)

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject: Ха..Ха..Ха..
PostPosted: Sun Nov 29, 2009 1:07 pm 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
Вероятно здесь нам впарили не работающий код
(Мне все больше нравится Tryton!!!! - почти такая-же реализация)
Посмотрев различие реализации исправил ошибку... так!

./service/web_services.py
функция def dump
Code:
def dump(self, password, db_name):

.....
cmd.append(db_name) <- после этой строки вставить
pipe = tools.exec_pg_command_pipe1(*tuple(cmd))
pipe.stdin.close()
data = pipe.stdout.read()
res = pipe.wait()
# Ниже код закомментировать как показано
#        stdin, stdout = tools.exec_pg_command_pipe(*tuple(cmd))
#        stdin.close()
#        data = stdout.read()
#        res = stdout.close() 


функция def restore
Code:
def restore(self, password, db_name, data):
....
            args2=tuple(args2) <- после этой строки вставить
                     
            pipe = tools.exec_pg_command_pipe1(*args2)
            if not os.name == "nt":
                   pipe.stdin.write(base64.decodestring(data))
            pipe.stdin.close()
            res = pipe.wait()
# Остальное закомментировать как показано
#           stdin, stdout = tools.exec_pg_command_pipe(*args2)
#           if not os.name == "nt":
#                 stdin.write(base64.decodestring(data))
#           stdin.close()
#           res = stdout.close()


а теперь сама функция tools.exec_pg_command_pipe1
файл находится в ./tools/misc.py
# Это нужно вставить в начале файла
import subprocess
# а это можно возле родной функции скопировать exec_pg_command_pipe
Code:
def exec_pg_command_pipe1(name, *args):         
    prog = find_pg_tool(name)
    if not prog:                                         
        raise Exception('Couldn\'t find %s' % name)       
    if os.name == "nt":             
        cmd = '"' + prog + '" ' + ' '.join(args)                 
    else:                                               
        cmd = prog + ' ' + ' '.join(args)   
                                                 
    # if db_password is set in configuration we should pass
    # an environment variable PGPASSWORD to our subprocess
    # see libpg documentation                                         
    child_env = dict(os.environ)                                       
    if config['db_password']:                                                     
        child_env['PGPASSWORD'] = config['db_password']
    pipe = subprocess.Popen(cmd, shell=True,
                            stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                            close_fds=True,
                            env=child_env)
    return pipe                                         



И о чудо база сохраняется и восстанавливается!!!

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Dec 01, 2009 12:39 am 
Offline

Joined: Tue Dec 01, 2009 12:15 am
Posts: 6
A eto budet na vseh OS rabotat, s paipami-to ?

Delau vse backupy skriptami cherez shell. V pg_restore na Linuxe est tozhe bagi - naprimer vosstanavliaet tolko esli u faila rashirenue .backup:)

Golovnaia bol tozhe mozhet bit esli backup delal odin polzovatel postgres,
a rg_restore drugoi.


Top
 Profile  
 
 Post subject: Должен работать
PostPosted: Tue Dec 01, 2009 7:48 am 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
[quote="hennegau"]
A eto budet na vseh OS rabotat, s paipami-to ?
Выдержка из модуля subprocess
Code:
if mswindows:
    import threading
    import msvcrt
    if 0: # <-- change this to use pywin32 instead of the _subprocess driver
        import pywintypes
        from win32api import GetStdHandle, STD_INPUT_HANDLE, \
                             STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
        from win32api import GetCurrentProcess, DuplicateHandle, \
                             GetModuleFileName, GetVersion
        from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
        from win32pipe import CreatePipe
        from win32process import CreateProcess, STARTUPINFO, \
                                 GetExitCodeProcess, STARTF_USESTDHANDLES, \
                                 STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
        from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
    else:
        from _subprocess import *
        class STARTUPINFO:
            dwFlags = 0
            hStdInput = None
            hStdOutput = None
            hStdError = None
            wShowWindow = 0
        class pywintypes:
            error = IOError
else:
    import select
    import errno
    import fcntl
    import pickle


Delau vse backupy skriptami cherez shell. V pg_restore na Linuxe est tozhe bagi - naprimer vosstanavliaet tolko esli u faila rashirenue .backup:)
Странно у меня имя файла asdfg без расширения - и все работает!
В системе все передается через поток. Я прежде чем написать это протестировал у себя. Сохранение и восстановление в другую базу работает без ошибок.

Golovnaia bol tozhe mozhet bit esli backup delal odin polzovatel postgres,
a rg_restore drugoi.
А головная боль в чем заключается?
В недостаточности прав у другого пользователя?
Можете написать хотя бы насколько проблем? (Мне интересно.)

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject:
PostPosted: Wed Dec 02, 2009 1:18 am 
Offline

Joined: Thu Nov 05, 2009 1:37 pm
Posts: 146
Location: Russia, Saint-Petersburg
Приведу пример косяка, за hennegau:)
Сделал все по вышеописанному, на запуск говорит вот:
Code:
al@server:~$ sudo -u openerp -i `python /usr/lib/openerp-server/openerp-server.py`
Traceback (most recent call last):
  File "/usr/lib/openerp-server/openerp-server.py", line 68, in <module>
    logger.notifyChannel("server", netsvc.LOG_INFO, "version - %s" % release.version )
  File "/usr/lib/openerp-server/netsvc.py", line 160, in notifyChannel
    from service.web_services import common
  File "/usr/lib/openerp-server/service/__init__.py", line 23, in <module>
    import web_services
  File "/usr/lib/openerp-server/service/web_services.py", line 209
    if res:
    ^
IndentationError: unexpected indent

До "патчинга" -- работало


Top
 Profile  
 
 Post subject: Держи строй строк
PostPosted: Wed Dec 02, 2009 7:55 am 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
alukard404 wrote:
Приведу пример косяка, за hennegau:)
Сделал все по вышеописанному, на запуск говорит вот:
Code:
al@server:~$ sudo -u openerp -i `python /usr/lib/openerp-server/openerp-server.py`
Traceback (most recent call last):
  File "/usr/lib/openerp-server/openerp-server.py", line 68, in <module>
    logger.notifyChannel("server", netsvc.LOG_INFO, "version - %s" % release.version )
  File "/usr/lib/openerp-server/netsvc.py", line 160, in notifyChannel
    from service.web_services import common
  File "/usr/lib/openerp-server/service/__init__.py", line 23, in <module>
    import web_services
  File "/usr/lib/openerp-server/service/web_services.py", line 209
    if res:
    ^
IndentationError: unexpected indent

До "патчинга" -- работало

IndentationError: unexpected indent - это перевод с английского "неожиданный отступ"
Я всегда предупреждаю в python'е держи строй ровно, это твой косяк проверь на сколько пробелов различается отступы от предыдущей строки!!!

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject: Вот так должна выглядить функция
PostPosted: Wed Dec 02, 2009 8:07 am 
Offline

Joined: Fri Oct 30, 2009 4:32 pm
Posts: 74
Location: Russia, Omsk
Code:

    def dump(self, password, db_name):
        security.check_super(password)
        logger = netsvc.Logger()

        self._set_pg_psw_env_var()

        cmd = ['pg_dump', '--format=c', '--no-owner', '--ignore-version']
        if tools.config['db_user']:
            cmd.append('--username=' + tools.config['db_user'])
        if tools.config['db_host']:
            cmd.append('--host=' + tools.config['db_host'])
        if tools.config['db_port']:
            cmd.append('--port=' + str(tools.config['db_port']))
        cmd.append(db_name)

        pipe = tools.exec_pg_command_pipe1(*tuple(cmd))
        pipe.stdin.close()
        data = pipe.stdout.read()
        res = pipe.wait()
#        stdin, stdout = tools.exec_pg_command_pipe(*tuple(cmd))
#        stdin.close()
#        data = stdout.read()
#        res = stdout.close()
        if res:
            logger.notifyChannel("web-services", netsvc.LOG_ERROR,
                    'DUMP DB: %s failed\n%s' % (db_name, data))
            raise Exception, "Couldn't dump database"
        logger.notifyChannel("web-services", netsvc.LOG_INFO,
                'DUMP DB: %s' % (db_name))

        self._unset_pg_psw_env_var()

        return base64.encodestring(data)


А вот так restore
Code:

    def restore(self, password, db_name, data):
        security.check_super(password)
        logger = netsvc.Logger()

        self._set_pg_psw_env_var()
                                                                                                                                                           
        if self.db_exist(db_name):
            logger.notifyChannel("web-services", netsvc.LOG_WARNING,
                    'RESTORE DB: %s already exists' % (db_name,))
            raise Exception, "Database already exists"

        db = sql_db.db_connect('template1')
        cr = db.serialized_cursor()
        cr.autocommit(True) # XXX inhibit the effect of a serialized cursor. is it what we want ?
        try:
            cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "template0" """ % db_name) # Это должно быть на одной строке
        finally:
            cr.close()
            sql_db.close_db('template1')

        cmd = ['pg_restore', '--no-owner']
        if tools.config['db_user']:
            cmd.append('--username=' + tools.config['db_user'])
        if tools.config['db_host']:
            cmd.append('--host=' + tools.config['db_host'])
        if tools.config['db_port']:
            cmd.append('--port=' + str(tools.config['db_port']))
        cmd.append('--dbname=' + db_name)                                                           
        args2 = tuple(cmd)

        buf=base64.decodestring(data)
        if os.name == "nt":
            tmpfile = (os.environ['TMP'] or 'C:\\') + os.tmpnam()
            file(tmpfile, 'wb').write(buf)
            args2=list(args2)
            args2.append(' ' + tmpfile)
            args2=tuple(args2)
#--------------------------------------------------------                                                                                                   
        pipe = tools.exec_pg_command_pipe1(*args2)
        if not os.name == "nt":
            pipe.stdin.write(base64.decodestring(data))
        pipe.stdin.close()
        res = pipe.wait()
#        stdin, stdout = tools.exec_pg_command_pipe(*args2)
#        if not os.name == "nt":
#            stdin.write(base64.decodestring(data))
#        stdin.close()
#        res = stdout.close()
        if res:
            raise Exception, "Couldn't restore database"
        logger.notifyChannel("web-services", netsvc.LOG_INFO,
                'RESTORE DB: %s' % (db_name))

        self._unset_pg_psw_env_var()

        return True



Посмотри внимательно почти все строки на одной линии.
за исключением строк где есть условия if

_________________
Чужим Умом Жизнь не познаешь и счастливее не станешь...


Top
 Profile  
 
 Post subject: Re: Должен работать
PostPosted: Wed Dec 02, 2009 10:43 pm 
Offline

Joined: Tue Dec 01, 2009 12:15 am
Posts: 6
SilverFox1971 wrote:
А головная боль в чем заключается?
В недостаточности прав у другого пользователя?
Можете написать хотя бы насколько проблем? (Мне интересно.)


Naprimer Polzuus PG_admin - graficheskim administratorom, kotoriy poverh pg_restore i drugih utilit rabotaet.

esli log in kak odin polzovatel, a v backupe v base drugoi - pri vosstanovlenii
naprimer sobstevnnik vsei bazi perviy polzovatel stanovitsia, a otdlnih tablits -
vtoroi. v rezulatate bazu ne otkrit.
Esli perviy polzovatel superuser, to mozhno pomeniat vladelsta u vsei basi. Esli net, to bespolezno chto-to delat.

est optsia 'no user' v pg_restore, ona inogda pomogaet, no ne vsegda.
v printsipe ne problema, no nuzhno vremia sest i razobratsia po poriadku.

Uchitivia chto ERPserver obichno ne superuser v postgres, backup dvuh raznih serverov mozhet bit nesovmestimii. no eto vse teorii - proveriat nado.


Top
 Profile  
 
 Post subject: Ыы
PostPosted: Mon Dec 28, 2009 9:58 pm 
Offline

Joined: Thu Nov 05, 2009 1:37 pm
Posts: 146
Location: Russia, Saint-Petersburg
Все не мог добраться... сегодня посидел, на первое время нашел таблетку, если у кого есть ещё такая трабла))
Code:
CREATE DATABASE restore1
  WITH ENCODING='UTF8'
       OWNER=openerp
       TEMPLATE=maindb;

По смыслу понятно. Я это делаю через pgadmin3, если подскажет кто прямую команду -- буду благодарен. Единственно замеченная фишка, это то что к основной бд ("maindb") никто не должен обращаться.


Top
 Profile  
 
 Post subject: Re: backup?!
PostPosted: Sun Jan 16, 2011 4:35 pm 
Offline

Joined: Sat Jan 15, 2011 3:26 pm
Posts: 39
Установил 6.0.0.rc2

BackUp не работает... До сих пор проблема не решена разработчиками?


Top
 Profile  
 
 Post subject: Re: backup?!
PostPosted: Tue Jan 18, 2011 7:02 am 
Offline

Joined: Thu Nov 05, 2009 1:37 pm
Posts: 146
Location: Russia, Saint-Petersburg
2g1752:
То, что описано выше, про мою базу, так я думаю что там был косяк сделанный "старой"версией программы. Я через полгода все заново создавал и у меня теперь работают и бекапы и восстановления, но я это сделал через внешние скрипты.
К примеру так:
Code:
#!/bin/bash
#Скрипт бекапит базу $OEDB в файл $FILE, потом удаляет базу для експрементов ($ExpDB), и создает её. потом восстанавливает данные из бекапа в неё

$OEDB = "myopenerpdb"
$ExpDB = "mydbforexperiments"
$FILE = "/tmp/openerp.backup"


/usr/bin/pg_dump --host localhost --port 5432 --username openerp --format custom --blobs --oids --file "$FILE"  "$OEDB"
psql -c "DROP DATABASE $ExpDB" --dbname=postgres -a --host=localhost --port 5432 -U openerp
psql -c "CREATE DATABASE $ExpDB" --dbname=postgres -a --host=localhost --port 5432 -U openerp
/usr/bin/pg_restore --host localhost --port 5432 --username openerp --dbname $ExpDB "$FILE"

#скрипт немного не эргономичен, в плане, что придется четыре раза ввести пароль пользователя openerp для доступа к дб.


Last edited by alukard404 on Wed Jan 19, 2011 9:12 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: backup?!
PostPosted: Tue Jan 18, 2011 9:40 pm 
Offline

Joined: Sat Jan 15, 2011 3:26 pm
Posts: 39
Спасибо! Я правда "так" не умею, но буду иметь в виду. Может в стабильной весрии все же исправят? Все никак не выйдет она (((


Top
 Profile  
 
 Post subject: Re: backup?!
PostPosted: Wed Jan 19, 2011 9:14 am 
Offline

Joined: Thu Nov 05, 2009 1:37 pm
Posts: 146
Location: Russia, Saint-Petersburg
Глянте теперь на скрипт, так оно понятнее будет.
Посмотрите в топике выше. СильверФокс писал что и где надо исправить, для нормальной работы бекапов из программы.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 14 posts ] 

All times are UTC + 2 hours


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:

Protected by Anti-Spam ACP