Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно? / 10 сообщений из 10, страница 1 из 1
09.12.2016, 20:16
    #39363834
pgalaktionov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
Когда ты на сервере базы данных то
psql позволяет выполнять shell команды

postgres=# \! ls -l
total 153888
-rw-r--r-- 1 postgres postgres 0 Aug 26 16:23 1
-rw-r--r-- 1 postgres postgres 0 Aug 26 16:25 2
-rw-r--r-- 1 postgres postgres 38185299 Jul 21 19:51 953_upgrade_21072016.dmp
-rw-r--r-- 1 postgres postgres 37898664 Jul 21 19:52 9610_upgrade_21072016.dmp
-rw-r--r-- 1 postgres postgres 39642090 Jul 21 19:53 upgrade_21072016.dmp
-rw-r--r-- 1 postgres postgres 41845488 Jul 21 19:54 98_upgrade.dmp
-rw-r--r-- 1 postgres postgres 0 Aug 26 16:23 out.log
postgres=#


Можно ли что-то подобное сделать удаленно и получить output в cursor.

Пример python


Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
import psycopg2 as pg_driver
import time

conn = pg_driver.connect(host='192.168.xx.xxx',
						 port='5432',
						 user='postgres',
						 password='xxxx',
						 database='postgres'
						 )
query=" \! pg_dump -Fc xx_98_upgrade > /tmp/xxxv_98_upgrade2.dmp"
cur =conn.cursor()
cur.execute(query)
while True:
	row = cur.fetchone()
	if (not row):
		break
	print("%s" % (row))

conn.close()
...
Рейтинг: 0 / 0
09.12.2016, 20:17
    #39363836
pgalaktionov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
выдает ошибку

cur.execute(query)
psycopg2.ProgrammingError: syntax error at or near "\"
LINE 1: \! ls -l
^
...
Рейтинг: 0 / 0
09.12.2016, 20:22
    #39363839
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
pgalaktionov,

Курсор conn.cursor() выполняет команды sql, а не psql.
...
Рейтинг: 0 / 0
09.12.2016, 20:25
    #39363841
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
pgalaktionov,

нельзя. во-первых psql выполняет команды на локальной машине (где он запущен), а не на удаленной, во-вторых когда вы так подключаетесь из python это не psql уже.
если сильно хочется из запросов иметь возможность выполнять команды shell, то есть языки вроде pl/perlu, pl/sh которые можно в хранимых процедурах использовать. но нужно понимать риски безопасности.

а что вообще хотите сделать? пример с pg_dump очень уж странный. его то можно и локально запустить.
...
Рейтинг: 0 / 0
09.12.2016, 20:41
    #39363847
pgalaktionov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
Alexius,

автора что вообще хотите сделать? пример с pg_dump очень уж странный. его то можно и локально запустить.

Есть самописное на python веб приложение, для упрощения жизни ДБА в продуктовой компании.

Позволяет создавать,дропать, экспортить, импортить (схемы/базы) для различных баз данных Oracle,MSSQL,SYBASE,MYSQL,POSTGRESQL
Для нужд огромного кол-ва девелоперов и тестеров.

Для Oracle,MSSQL,SYBASE все реализовано

Необходимо теперь для PostgreSQL, реализовать возможность бэкапа/экспорта импорта баз через это приложение.


Есть ли в postgresql вызовы через sql чтобы забэкапить-экспортнуть базу. ?

например sybase работает

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  backup_directory= db_config[db_instance]['backup_dir']
    query = """dump database {DATABASE_NAME} to '{BACKUP_DIR}{DATABASE_NAME}_{TIME}.dmp'""".format(DATABASE_NAME=schema_name, TIME=cur_time,BACKUP_DIR=backup_directory)
    print(query)
    try:
        conn = sybase_driver.connect(username, password, database)
        cursor = conn.cursor()

        logging.debug(query)
        cursor.execute(query)
        for mess in conn.messages:
            print("%s " % mess[1][0])


        cursor.close()
        conn.close()

        return {'data': {backup_directory+schema_name+'_'+cur_time}, 'error': []}
...
Рейтинг: 0 / 0
09.12.2016, 21:10
    #39363855
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
pgalaktionov,

sql запроса, позволяющего снять дамп всей базы нет. скорее всего для этого придется тащить с собой и использовать pg_dump и pg_restore для восстановления из дампа.
портировать их логику в код на питоне скорей всего можно, но врядли это стоит делать.
...
Рейтинг: 0 / 0
09.12.2016, 21:25
    #39363859
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
pgalaktionovвеб приложениеТак и в чем проблема установить это приложение или его агента на сервер с БД.
...
Рейтинг: 0 / 0
10.12.2016, 07:56
    #39363974
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
pgalaktionov,

Есть несколько вариантов решения задачи
Например
1) сделать скрипт (например для bash) который вызывает pg_dump с соответствующими параметрами
2) У PostgreSQL есть information_schema из которой можно вытащить всю метаинформацию по БД (таблицы, сиквенсы, индексы и пр.)
...
Рейтинг: 0 / 0
12.12.2016, 13:42
    #39364836
pgalaktionov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
mad_nazgul,

авторЕсть несколько вариантов решения задачи
Например
1) сделать скрипт (например для bash) который вызывает pg_dump с соответствующими параметрами
2) У PostgreSQL есть information_schema из которой можно вытащить всю метаинформацию по БД (таблицы, сиквенсы, индексы и пр.)

Спасибо видимо, это как раз единственный правильный подход. Буду так делать.
...
Рейтинг: 0 / 0
12.12.2016, 15:01
    #39364942
pgalaktionov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно?
НАШЕЛ ВЫХОД из ситуации. ЮХУУУ

Ставиться расширение
yum install postgresql-plperl.x86_64

Далее
через SQL

CREATE LANGUAGE plperlu;


Создаем функцию

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION BACKUP_DATABASE(DATABASE_NAME text) RETURNS text AS $BODY$
    use warnings;
    use strict;
    my $DATABASE_NAME = $_[0];
    my $output = `pg_dump -Fc $DATABASE_NAME >/tmp/$DATABASE_NAME `;
    return($output);
$BODY$ LANGUAGE plperlu;



Далее

Код: sql
1.
select * from BACKUP_DATABASE('98_upgrade')




Далее

Код: powershell
1.
2.
3.
-bash-4.2$ ls -l /tmp
total 177328
-rw------- 1 postgres postgres 60522823 Dec 12 15:05 98_upgrade
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите можно ли и как. Выполнить shell command в psql соединившись удаленно? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]