Найти - Пользователи
Полная версия: ms sql 2008 r2 backup - пропадает результирующий файл
Начало » Базы данных » ms sql 2008 r2 backup - пропадает результирующий файл
1 2
Ace
Добрый !

Писал процедуру копирования. Сам процесс проходил успешно, кроме финала.
Вижу, что файл создается, но после завершения скрипта - сразу пропадает. В мусорке нет, на диске нет.

Извините, вопрос почти сразу закрылся решением (см. ниже)
Может, пригодится кому-нить

 # -*- coding: utf-8 -*-
import pyodbc
import time
db_conn=pyodbc.connect('DRIVER={SQL Server};SERVER=192.168.0.3;DATABASE=base_name;UID=username;PWD=password',autocommit=True)
db_cursor=db_conn.cursor()
db_cursor.execute(r"BACKUP DATABASE database_name TO DISK='d:\sql\backup\123.bak' ")
# !!!
time.sleep(1)  
db_cursor.close()
db_conn.close()


P.S. Намек на решение оказался тут же на форуме
Намек на этом же сайте…
почему-то без костыля в виде паузы не работает
py.user.next
Ace
почему-то без костыля в виде паузы не работает
Вообще, коммит принято делать
https://github.com/mkleehammer/pyodbc/wiki/Getting-started#updating-and-deleting
Ace
Пробовал в различных комбинациях. Представленный код минимально рабочий.
Если поставить коммит , но убрать паузу - не работает. Т.е симптом именно как в топике - файл создается, а после выполнения скрипта удаляется.
ZerG
ну знаете.
У вас код немного марсианский тоже между прочим.
вы либо открывайте файл питоном через
with open(…) as f:

И заполняйте его селектом.
Или выполняйте бекап через subprocess
а то как то белое с квадратным смешано.
Ace
Ну почему марсианский.
Эта просто выполнение средствами питона типовых команд MS SQL server.
При их выполнении из MS SQL Studio не надо никакого колдовства - просто выполняется и сохраняет файл куда указано.
Ace
py.user.next
Ну вообще-то BACKUP это не DML и не DDL, т.к. команда не определяет структуру данных и не вмешивается в них. Поэтому не вижу в коммите. Тем более, в строке соединения включен автокомит.
Без него команда не выполняется в принципе.
py.user.next
Ace
Поэтому не вижу в коммите.
Сами модули питона могут быть неправильными, так как они часто сторонние, поэтому обычная логика здесь не применима.

Сделай маленькую базу и примени к ней свой скрипт.
Ace
Так я на боевой базе и пробую. с паузой работает, без пауз файл бэкапа пропадает.
Пробовал одним файлом бэкапить несколько баз, паузу стояла после всех команд бэкапа - сохранился только последний файл.
Правльно понимаю, вы предлагаете после самой команды бэкапа еще дать явную SQL COMMIT или курсоровский коммит-метод из питона ?
Ace
Хорошо. Пытаемся провести ПФЭ. Всю обвязку писать не буду, только нужное

1.
 db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak';COMMIT;")
- файл бэкапа пропадает
2.
 db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak';COMMIT;")
db_conn.commit()
- файл бэкапа пропадает
3.
 db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'")
db_conn.commit()
- файл бэкапа пропадает
4.
 db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'")
db_cursor.commit()
- файл бэкапа пропадает
5.
 db_cursor.execute(r"BEGIN TRANSACTION")
db_cursor.execute(r"BACKUP DATABASE tcsbase_empty TO DISK='d:\sql\backup\tcsbase26.bak'")
db_cursor.execute(r"COMMIT TRANSACTION")
- ошибка “невозможно выполнить операцию резервного копирования или восстановления в пределах транзакции”, что логично. Если есть несколько одновременных активных транзакций - шут его знает, что попадет в бэкап

Т.е пока помогает только пауза. Или я делаю нечто совсем незаконное ?

P.S.
- MS SQL 2008 R2 10.50.6220
- python 3.6.3
- pyodbc 4.0.24
py.user.next
Ace
Так я на боевой базе и пробую. с паузой работает, без пауз файл бэкапа пропадает.
А я предлагаю сделать маленькую базу и проверить этот скрипт на ней, убрав sleep() из него. Потому что пропадает файл не просто так, а по какой-то причине. Вот её и надо определить, а не действовать наугад.

Всё, давай, без коммитов свой первый скрипт с закомментированным sleep() применяешь к маленькой базе.

Я думаю, файл пропадает потому, что скрипт не успевает закончить операцию и его завершение приводит к её отмене. Таким образом оно думает, что файл этот не нужен, раз он не дописан.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB