Вопрос или проблема
Я пытаюсь восстановить несколько файлов .bak, используя команду RESTORE
, но не признает использование параметра URL, ошибка говорит
ProgrammingError: (‘42000′, “[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]’URL’ не является распознанным параметром RESTORE. (155) (SQLExecDirectW)”)
Есть ли способ восстановить несколько файлов .bak или обойти эту проблему в моем коде?
import pyodbc
import pandas as pd
server = "[REDACTED]"
username = "[REDACTED]"
password = "[REDACTED]"
conn_str = "[REDACTED]"
# Установить соединение
conn = pyodbc.connect(conn_str)
conn.autocommit = True
cursor = conn.cursor()
sas_token = '[REDACTED]'
url="https://[REDACTED]/PROD_2009_1round.bak"
url2 = 'https://[REDACTED]/PROD_2009_2round.bak'
# Определить команду восстановления с использованием объекта учетных данных
restore_command = f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url}'
WITH FILE = 1, NOUNLOAD, STATS = 10,
URL = '{url2}',
WITH FILE = 2;
"""
# Выполнить команду восстановления
cursor.execute(restore_command)
# Закрыть курсор и соединение
cursor.close()
conn.close()
Ранее я использовал этот фрагмент кода для RESTORE
, но ошибка, которую я получаю, такова:
restore_command = f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url}', URL = '{url2}';
"""
ProgrammingError: (‘42000’, ‘[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Загрузочные медиа на “https:[REDACTED]/PROD_2009_1round.bak” отформатированы для поддержки 1 медиа-семей, но 2 медиа-семьи ожидаются согласно спецификации устройства резервного копирования. (3231) (SQLExecDirectW)’)
Вы не можете указать несколько параметров URL
в одной команде.
Вместо этого вам нужно восстановить каждый файл резервной копии в отдельных командах.
# Восстановить 1-й резервный вариант
cursor.execute(f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url}'
WITH FILE = 1, NOUNLOAD, STATS = 10;
""")
# Восстановить 2-й резервный вариант
cursor.execute(f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url2}'
WITH FILE = 1, NOUNLOAD, STATS = 10;
""")
или вы можете использовать цикл:
urls = [url, url2]
for i, url in enumerate(urls, start=1):
cursor.execute(f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url}'
WITH FILE = {i}, NOUNLOAD, STATS = 10;
""")
Ответ или решение
Восстановление нескольких файлов .bak в Databricks может показаться трудной задачей из-за ограничений SQL Server на выполнение команд восстановления. Ваша проблема в том, что вы пытаетесь использовать несколько опций URL в одной команде RESTORE, что не поддерживается SQL Server. Давайте рассмотрим, как правильно восстановить несколько резервных копий, используя предоставленный вами код.
Решение по восстановлению нескольких .bak файлов
SQL Server поддерживает возврат данных из резервных копий, хранящихся в облаке (например, Azure), но команды RESTORE не позволяют указывать несколько URL в одном запросе. Чтобы обойти это ограничение, вам необходимо выполнять восстановление поочередно для каждого файла резервной копии.
Пример кода для восстановления нескольких резервных копий
Ваша первоначальная попытка с использованием составной команды завершалась ошибкой, так как корректный синтаксис не поддерживает несколько URL. Следовательно, для каждого файла резервной копии необходимо выполнять отдельный запрос. Вот подробный пример, как это можно реализовать.
import pyodbc
import pandas as pd
# Настроим соединение с SQL Server
server = "[REDACTED]"
username = "[REDACTED]"
password = "[REDACTED]"
conn_str = "[REDACTED]"
# Установим соединение
conn = pyodbc.connect(conn_str)
conn.autocommit = True
cursor = conn.cursor()
# URL резервных копий
urls = [
"https://[REDACTED]/PROD_2009_1round.bak",
"https://[REDACTED]/PROD_2009_2round.bak"
]
# Цикл для восстановления каждой резервной копии
for i, url in enumerate(urls, start=1):
restore_command = f"""
RESTORE DATABASE [PROD_2009]
FROM URL = '{url}'
WITH FILE = {i}, NOUNLOAD, STATS = 10;
"""
try:
cursor.execute(restore_command)
print(f"Успешно восстановлена резервная копия из {url}")
except pyodbc.Error as e:
print(f"Ошибка при восстановлении из {url}: {e}")
# Закрываем курсор и соединение
cursor.close()
conn.close()
Объяснение кода
-
Импорт библиотек: Импортируйте необходимые библиотеки, такие как
pyodbc
для работы с SQL Server иpandas
для будущих манипуляций с данными. -
Настройка соединения: Укажите необходимые параметры для подключения к SQL Server.
-
Цикл восстановления: Используя цикл
for
, вы последовательно обрабатываете каждый URL, формируя команду RESTORE для каждой резервной копии. Это позволяет избежать ошибок, связанных с множественными URL. -
Обработка ошибок: С помощью блока
try-except
вы можете перехватывать возможные ошибки и выводить их на экран для дальнейшей диагностики.
Заключение
Используя предложенный подход, вы сможете успешно восстановить данные из нескольких файлов .bak в Databricks. Простота кода и его структурированность позволяют легко адаптировать решение под дополнительные требования, если такие возникнут в будущем. Этот метод гарантирует надежное восстановление резервных копий без столкновения с проблемами, связанными с несовместимостью команд SQL Server.