Мені поставлено завдання спробувати відновити базу даних, яка постраждала від корупції (через збій вводу / виводу, який виправлено з того часу). Я не знайомий з базою даних або тим, що вона містить.
Мені було надано старе (~ 3 тижні) повне резервне копіювання та ряд журналів транзакцій ... однак відсутні журнали транзакцій, тому я можу відновитись лише до певної дати. Не вистачає 2,5 тижнів даних (і в цю базу даних постійно додається багато даних).
Мені також дали копію корумпованої бази даних (яка доступна, але з великою кількістю сторінок пошкоджені / відсутні).
Я спробував типові DBCC CHECKDB
команди (все ще ні repair_allow_data_loss
, це буде моєю останньою інстанцією, якщо нічого іншого не вийде).
Після того, як багато хто приходить і переходить до бази даних (db - це 1,5 терабайтний маленький монстр, і все, що я роблю, повільно і займає певний час), я намагався відновити Інтернет-сторінку з останнього відомого хорошого резервного копіювання для пошкоджених сторінок.
Для цього я зробив сценарій, який створює багато RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
команд з DBCC CHECKDB
виводу (базічно регулярний вираз і виразний) ... поки що добре, це спрацювало до моменту, коли він сказав, що я досяг границі в 1000 сторінок на файл (на цьому db є 8 файлів) на команду відновлення.
Тож він просить мене "завершити відновлення в Інтернеті", але я втрачаю те, як це зробити ... У мене немає журналу хвоста або нічого більш повного, ніж повне резервне копіювання, з якого я починаю, так Я взагалі не знаю, як завершити відновлення, щоб продовжувати намагатися з рештою сторінок.
Я спробував, RESTORE DATABASE <foo> WITH RECOVERY
але це теж не вийшло, він запитує у мене журналу, якого у мене немає.
Хтось має поради, як я можу спробувати відновити що-небудь звідси? Або як "завершити" відновлення в Інтернеті, щоб я міг намагатися відновити більше сторінок? Чи буде у мене така ж проблема, якщо я спробую відновити офлайн (в основному додаю WITH NORECOVERY
до всього, а потім намагаюся повернути його в кінці?)
Опрацювання бази даних вручну в основному не підлягає ... є сотні таблиць з мільйонами рядків і немає чіткого сенсу того, що це є. Пошкоджений БД не зможе отримати SELECT
запити через кілька мільйонів рядків, але я не впевнений, що можу десь розібратися. Я спробував відновити всі некластеризовані індекси, але є пошкоджені сторінки з даними рядків, так що і це не спрацювало.
Деяка втрата даних була б прийнятною, але послідовність у БД повинна хоча б намагатися досягти.
Пошкоджена база даних - це все-таки в Інтернеті, і клієнти працюють над нею (тому він постійно отримує нові дані), тому будь-який процес, який я роблю на лавці лабораторії, повинен бути відтвореним у виробничій базі даних згодом (час простою буде важким для цього).
Це SQL Server 2014 Enterprise
PS: Я не DBA ... Я програміст, але клієнт випробував кілька "експертних" служб відновлення аварійних ситуацій, і вони відмовилися, тому мене попросили подивитися і подивитися, чи зможу я зробити що-небудь.
Оновлення : після багатьох тестів, відновлення сторінки за сторінкою не було, тому ми викинули цю ідею. Ми збираємось вручну відновити (вручну вибираючи відсутні файли з пошкоджених таблиць і вставляючи їх в останній відомий гарний резервний копій), робимо деякі автоматизовані інструменти для цього (знову ж таки, сотні і сотні таблиць).