powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Файл БД недоступен при выключенном сервере
9 сообщений из 9, страница 1 из 1
Файл БД недоступен при выключенном сервере
    #39996177
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XP sp3,MS SQL Server 2000, Borland C++ builder 5
Весьма старую программу был вынужден перевести с BDE на ADO.
Всё работает... кроме
Есть ф-я, создающая архив БД.
1) разорвать соединение
2) получить перечень файлов БД
2) остановить сервер
3) создать архив из этих файлов
4) включить сервер
5) открыть соединение
Старая программа работает верно
Новая говорит что файлов БД не существует
ф-я, создающая архив одна и та же, кроме создания и разрыва соединения
О не существовании сообщают как ф-ия access, так и конструктор класса TFileStream

Буду благодарен за любую гипотезу
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996187
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем для бэкапа разрывать соединение ?
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996283
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07,

попробовать прочитать файлы через WinApi и проанализировать ошибки, если будут.
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А когда вообще файлы MS SQL стали вдруг доступны клиенту?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996433
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

А когда вообще файлы MS SQL стали вдруг доступны клиенту?..


В первом сообщении описано.
Всё физически на одном ПК, выключив службу - становятся доступны.

И видимо backup из MS SQL "не подходит"...
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996438
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07
Буду благодарен за любую гипотезу

Разрешения NTFS посмотреть на конкретно файлах БД...
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996491
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07,

я так делал горячий бэкап (правда, этот способ не подходит, если настроен бэкапирующий джоб)

скрипт для бэкапа "backup_script.sql"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select getdate(), '------------------------------------------------------'

use PrimeDB
BACKUP DATABASE PrimeDB TO DISK = 'B:\DB_BACKUP\PrimeDB.bak' with init, compression
go

select getdate(), '------------------------------------------------------'

use SecondDB
BACKUP DATABASE SecondDB TO DISK = 'B:\DB_BACKUP\SecondDB.bak' with init, compression
go

select getdate(), '------------------------------------------------------'




далее, его вызывал из батника (поменяйте "127.0.0.1\SQLServerInstance" на своё, возможно у вас просто "127.0.0.1"):
Код: powershell
1.
sqlcmd -S 127.0.0.1\SQLServerInstance -i "c:\My Scripts\BackupMSSQL\backup_script.sql" -o "B:\DB_BACKUP\log_of_sql.txt"


и получал довольно прилично сжатые файлы


когда-нибудь потом можно базу восстановить из бэкапа, хоть на другом сервере, подобным скриптом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
RESTORE DATABASE PrimeDB
FROM DISK = 'B:\DB_BACKUP\PrimeDB.bak'
WITH
   MOVE 'PrimeDB' TO 'D:\SQLDB\PrimeDB.mdf',
   MOVE 'PrimeDB_log' TO 'D:\SQLDB\PrimeDB_log.ldf'
   
   
RESTORE DATABASE SecondDB
FROM DISK = 'B:\DB_BACKUP\SecondDB.bak'
WITH
   MOVE 'SecondDB' TO 'D:\SQLDB\SecondDB.mdf',
   MOVE 'SecondDB_log' TO 'D:\SQLDB\SecondDB_log.ldf'
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39996836
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён,

Хах.
Когда мне было нечего делать и надо было сбэкапить SQL-сервер...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
:: ****************************************************************************
:: sql_backup.cmd
:: Cкрипт для резервного копирования папок на диске и баз данных MS SQL Server
:: 
:: Формат вызова: sql_backup.cmd profile [count]
::
:: Параметры:
::   profile - имя профиля резервного копирования (см. ниже)
::   count   - количество хранимых резервных копий, по-умолчанию равно 99. Если 
::             значение этого параметра равно 0, то архивы удаляться не будут.
::
:: Каждому профилю должен соответствовать файл ^<profile^>.lst, со списком баз
:: данных для архивирования.
::
:: ****************************************************************************

@echo off
chcp 1251 > nul
set version=0.2
set dcode=%date:~6%%date:~3,2%%date:~0,2%

:: ----- НАЧАЛО БЛОКА НАСТРОЕК СКРИПТА -----
::  Пробелы перед и после '=' недопустимы!

:: Расположение утилит 7z.exe и blat.exe
set tools=C:\Script\Tools
:: Путь к утилитам SQL сервера
set sqlbin=D:\Microsoft SQL Server\110\Tools\Binn

:: Почтовый адрес для отправки отчетов об ошибках
set mailto=admin@server.com
:: От чьего имени отправляются письма
set mailfrom=%COMPUTERNAME%@domain
:: Тема писем с отчетами об ошибках
set subject=%COMPUTERNAME% SQL Backup Report - %prefix%
:: Адрес почтового сервера для отправки сообщений об ошибках (без авторизации)
set smtpsrvr=smtp.server.com

:: Временная папка для создания резервных копий и выгрузки баз данных
set backtmp=D:\Backup\MSSQL%dcode%
:: Полный путь к папке с резервными копиями 
set backups=\\server\backup\%COMPUTERNAME%
:: Имя пользователя для доступа к сетевой папке с резервными копиями 
set login=net_login
:: Пароль для доступа к сетевой папке с резервными копиями 
set passwd=net_password

:: ----- КОНЕЦ БЛОКА НАСТРОЕК СКРИПТА -----

title Создание резервной копии данных...

echo Инициализация...
set errorcode=0
if not exist %~dp0logs mkdir %~dp0logs
set logfile=%~dp0logs\%~n0_%prefix%.log
set templog=%~dp0logs\%~n0_%prefix%.tmp
if "%1" equ "" (goto help) else set prefix=%1
set /a cnt=%2+0 > nul 2>&1
if "%cnt%" neq "%2" (set count=99) else set count=%2

echo Профиль резервного копирования: %prefix%, хранимых копий: %count%
echo Скрипт %~nx0, версия %version%, начало работы: %date% в %time:~0,8%. >> %logfile% 
echo Параметры вызова: %~nx0 %1 %2  >> %logfile% 
echo Префикс [%prefix%], хранить [%count%] резервных копий >> %logfile% 
echo. >> %logfile% 

echo Расположение утилит:        %tools%  >> %logfile% 
echo Путь к SQL серверу:         %sqlbin%  >> %logfile% 
echo Папка для временных файлов: %backtmp%  >> %logfile% 
echo Путь для хранения копий:    %backups%  >> %logfile% 
if "%backups:~0,2%" equ "\\" echo Имя сетевого пользователя:  %login% >> %logfile% 
echo. >> %logfile% 

echo Создаём временные каталоги для резервных копий >> %logfile% 
if not exist %backtmp% mkdir %backtmp% >> %logfile% 2>&1
if "%backups:~0,2%" equ "\\" (
  net use %backups% /USER:%login% %passwd% >> %logfile% 2>&1
  if %errorlevel% neq 0 goto error
)
if not exist %backups% (
  mkdir %backups% >> %logfile% 2>&1
  if %errorlevel% neq 0 goto error
)

if not exist %prefix%.lst (
  echo Файл со списком баз данных не найден. >> %logfile% 
  goto nolist
)

echo Резервное копирование баз данных...
echo. > %templog% 
echo Начинаем резервное копирование баз данных. >> %logfile%  
for /f "eol=;" %%a in (%prefix%.lst) do (
  echo   Экспорт БД "%%a"
  echo PROCESSING "%%a"... >> %templog%
  "%sqlbin%\sqlcmd.exe" -E -S "localhost" -w160 -Q"Backup Database %%a To Disk = '%backtmp%\%%a.bak' With NoFormat,NoInit" >> %templog% 2>&1
  if "%errorlevel%" neq "0" set errorcode=%errorlevel%
  echo. >> %templog%
)
findstr /I /C:"BACKUP DATABASE" /C:"PROCESSING" %templog% >> %logfile% 2>&1
if "%errorcode%" neq "0" goto sendmail

echo Архивация резервных копий баз данных...
pushd "%backtmp%"
echo Архивация резервных копий баз данных. >> %templog%
%tools%\7z.exe a "%backups%\%prefix%_%dcode%.7z" "*.bak" -mx5 -mmt12  >> %templog% 2>&1
set errorcode=%errorlevel%
popd
findstr /I /C:"Creating archive" /C:"Everything is Ok" %templog% >> %logfile% 2>&1

if "%errorcode%" neq "0" goto sendmail
rd /q /s %backtmp% >> %logfile% 2>&1 
echo. >> %logfile%

if "%count%" equ "0" goto sendmail
echo Удаление устаревших архивов...
echo Удаляем устаревшие архивы резервных копий. >> %logfile%
for /F "usebackq delims== skip=%count%" %%i in (`dir "%backups%\%prefix%_*.7z" /A-R /B /O:-N`) do del /Q %backups%\%%i >> %logfile% 2>&1

:sendmail
if "%errorcode%" neq "0" (
  echo При выполнении сценария обнаружены ошибка, отправляем журнал администратору...
  echo Отправляем администратору сообщение о произошедшей ошибке. >> %logfile%
  %tools%\blat.exe %templog% -charset Windows-1251 -to %mailto% -i %mailfrom% -s "%subject%" -server %smtpsrvr% 
)
del /q %templog% >> %logfile% 2>&1
if "%backups:~0,2%" equ "\\" net use %backups% /d >> %logfile% 2>&1

echo. >> %logfile% 
echo Скрипт завершил свою работу %date% в %time:~0,8%. >> %logfile%
echo -------------------------------------------------------------------------------- >> %logfile% 
echo. >> %logfile% 

goto :eof

:error
set errorcode=NO_PATH
echo Ошибка: не найден путь для архивации (%backups%). > %templog%
type %templog% >> %logfile%  
goto sendmail

:nolist
set errorcode=NO_LIST
echo Ошибка: не найден файл со списком баз данных для архивации (%prefix%.lst). > %templog%
type %templog% >> %logfile%  
goto sendmail

:help
cls
echo Сценарий для резервного копирования MS-SQL баз данных и файлов.
echo Использование: %~nx0 profile [count]
echo.
echo Параметры:
echo   profile - имя профиля резервного копирования (см. ниже)
echo   count   - количество хранимых резервных копий, по-умолчанию равно 99. Если 
echo             значение этого параметра равно 0, то архивы удаляться не будут.
echo.
echo Каждому профилю должен соответствовать файл ^<profile^>.lst, содержащий список 
echo баз данных для архивирования.
echo.
echo Формат файла-списка баз данных:
echo.
echo название_базы1
echo название_базы2
echo название_базы3
echo ...
echo.
echo Строки, начинающиеся с символа ";", считаются комментариями.
echo.
echo Текущие параметры сценария:
echo.
echo   Расположение утилит:        %tools%  
echo   Путь к SQL серверу:         %sqlbin%
echo   Папка для временных файлов: %backtmp%
echo   Путь для хранения копий:    %backups%
if "%backups:~0,2%" equ "\\" echo   Имя сетевого пользователя:  %login%
echo.
echo Нажмите любую клавишу для выхода.
pause > nul
goto :eof
...
Рейтинг: 0 / 0
Файл БД недоступен при выключенном сервере
    #39997441
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После долгих мучений выяснил:
sp_helpfile возвращает список файлов БД в поле nchar(260)
(пытался найти логику microsoft в выборе этого формата, но не смог)
после имени файла следуют пробелы до конца.
Я полагал, что это varchar или nvarchar и будет финальный 0 в конце имени (C++Builder).
После того, как сам поставил этот ноль, всё заработало.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Файл БД недоступен при выключенном сервере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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