Что такое код dbase_delete_record


Содержание

Что такое код dbase_delete_record

Э ти функции позволяют получить доступ к записям в dBase-формате (dbf) базы данных.

Н е поддерживаются индексы и мемо(записи) поля. Также не поддерживается блокировка. Два webсервер процесса, одновременно изменяющие файлы dBase вполне возможно повредят вашу базу данных.

В отличие от баз данных SQL, в dBase нельзя изменять определение полей после их создания. Если только файл создан, то поля базы данных фиксировано определены. Не имеется никаких индексов, которые ускоряют поиск или иначе организовывает ваши данные. dBase файлы — это простые последовательные файлы с записями фиксированного размера. Записи добавляются в конец файла и удаленные записи будут присутствовать в вашей базе до тех пор, пока вы не вызовете dbase_pack() функцию.

М ы рекомендуем вы не использовать dBase файлы для профессионального использования фаз данных. Выберете взамен какой-нибудь реальный SQL сервер; MySQL или Postgres лучший выбор для работы вместе с PHP. Поддержка dBase введена для импорта и экспорта ваших данных из и в вашу web базу данных, так как этот формат обычно понимают многие программы, например электронные таблицы, в Windows. Поддержка dBase для любого экспорта или импорта данных хорошо выполняет эти условия.

dbase_create — создать dBase базу данных

Описание int dbase_create(string filename, array fields);

П араметр fields — это массив из массивов, каждый массив определяет формат одного поля в базе данных. Каждое поле состоит из имени, символа , указывающего тип поля, длины, и точность.

Д оступные типы полей:

L Логическое. Не требует длину или точность.

M Мемо. (Помните, что они не поддерживаются в PHP.) Не требует длину или точность.

D дата (сохраненная как ГГГГММДД). Не требует длину или точность.

N Числовое. Это поле имеет и длину и точность(количество цифр после десятичной точки).

C Строка. Имеет длину и не требует точность.

Е сли создание базы данных успешно, то возвращает dbase_identifier(идентификатор базы данных), в противном случае возвращает false(ложь).

Пример Создание dBase базы данных

dbase_open — открыть dBase базу данных

Описание int dbase_open(string filename, int flags);

П араметр flags используется для системного вызова open(). (Обычно 0 только для чтения, 1 только для записи, и 2 для записи и чтения.)

В озвращает dbase_identifier(идентификатор базы данных) для открытой базы данных, или false(ложь) если база данных не была открыта.

dbase_close — закрыть dBase базу данных

Описание bool dbase_close(int dbase_identifier);

З акрыть базу данных, связанную с dbase_identifier.

dbase_pack — упаковывает dBase базу данных

Описание bool dbase_pack(int dbase_identifier);

У паковывает определенную базу данных (удаляет все записи, помеченные для удаления с помощью dbase_delete_record().

dbase_add_record — добавляет запись в dBase базу данных

Описание bool dbase_add_record(int dbase_identifier, array record);

Д обавляет данные из record в базу данных. Если количество полей в заданном record не идентично количеству полей в базе данных, то операция будет прервана и будет возвращено false(ложь).

dbase_delete_record — удалить запись из dBase базы данных

Описание bool dbase_delete_record(int dbase_identifier, int record);

П омечает запись record to на удаление из базы данных. Чтобы физически удалить запись из базы данных, вы должны вызвать dbase_pack().

dbase_get_record — получить запись из dBase базы данных

Описание array dbase_get_record(int dbase_identifier, int record);

В озвращает данные из записи record в массив. Массив индексирован начиная с 1, и включает в себя поле «deleted», которое установлено в 1 если запись помечена на удаление (смотри dbase_delete_record().)

В се поля преобразовываются в соответствующий PHP тип. (Даты остаются строками.)

dbase_numfields — Выясняет, какое количество полей находится в dBase базе данных


Описание int dbase_numfields(int dbase_identifier);

В озвращает количество полей в определенной базе данных. Номера полей находятся в промежутке с 0 и до dbase_numfields($db)-1, в то время как номера записей начинаются с 1 и до dbase_numrecords($db).

Пример Использование dbase_numfields()

dbase_numrecords — Выясняет, какое количество записей находится в dBase базе данных

Описание int dbase_numrecords(int dbase_identifier);

В озвращает количество записей в определенной базе данных. Номера записей начинаются с 1 и до dbase_numrecords($db) , в то время как номера полей находятся в промежутке с 0 и до dbase_numfields($db)-1.

Замечания

Если команда SET DELETED установлена в ON , записи, отмеченные для удаления игнорируются всеми командами, которые содержат scope. Для подробной информации, см. SET DELETED Command .

Чтобы определять количество модифицированных записей, используйте значение системной переменной _TALLY немедленно после выполнения команды SQL DELETE . Для подробной информации, см. _TALLY System Variable .

Совет:
При маркировке на удаление нескольких записей таблицы, открытой для разделяемого доступа, SQL DELETE использует блокировку записей, в отличие от команды DELETE . Это уменьшает конфликты записей в многопользовательских ситуациях, но может уменьшить скорость выполнения. Для максимальной скорости выполнения, откройте таблицу для монопольного использования или применяйте функцию FLOCK( ) для блокировки таблицы. Для подробной информации, см. DELETE Command и FLOCK( ) Function .

Пример 1

Описание

Следующий пример использует команду OPEN DATABASE , чтобы открыть тестовую базу данных Visual FoxPro TestData.dbc. Команда USE открывает таблицу «Клиенты» в TestData.dbc. Инструкция SQL DELETE помечает те записи на удаление, в которых поле Country содержит «USA». Команда CLEAR очищает главное окно Visual FoxPro. Команда LIST выводит все записи, отмеченные для удаления. После применения команды LIST , если будет вызвана команда PACK , отмеченные записи будут удалены.

Команда RECALL ALL снимает выделение всех записей, помеченных на удаление. Команда COUNT проверяет количество записей, помеченных на удаление, подсчитывая их. WAIT WINDOW выводит то количество записей, которые были помечены на удаление.

Что такое код dbase_delete_record

Скидка 25% на все тарифы хостинга по промокоду STDCITF

Не поддерживаются индексы и мемо(записи) поля. Также не поддерживается блокировка. Два webсервер процесса, одновременно изменяющие файлы dBase вполне возможно повредят вашу базу данных.

В отличие от баз данных SQL, в dBase нельзя изменять определение полей после их создания. Если только файл создан, то поля базы данных фиксировано определены. Не имеется никаких индексов, которые ускоряют поиск или иначе организовывает ваши данные. dBase файлы — это простые последовательные файлы с записями фиксированного размера. Записи добавляются в конец файла и удаленные записи будут присутствовать в вашей базе до тех пор, пока вы не вызовете dbase_pack() функцию.

Мы рекомендуем вы не использовать dBase файлы для профессионального использования фаз данных. Выберете взамен какой-нибудь реальный SQL сервер; MySQL или Postgres лучший выбор для работы вместе с PHP. Поддержка dBase введена для импорта и экспорта ваших данных из и в вашу web базу данных, так как этот формат обычно понимают многие программы, например электронные таблицы, в Windows. Поддержка dBase для любого экспорта или импорта данных хорошо выполняет эти условия.

dbase_create

Описание

Доступные типы полей:

L Логическое. Не требует длину или точность.
M Мемо. (Помните, что они не поддерживаются в PHP.) Не требует длину или точность.
D дата (сохраненная как ГГГГММДД). Не требует длину или точность.
N Числовое. Это поле имеет и длину и точность(количество цифр после десятичной точки).
C Строка. Имеет длину и не требует точность.

Если создание базы данных успешно, то возвращает dbase_ >

dbase_open

Описание

Возвращает dbase_identifier(идентификатор базы данных) для открытой базы данных, или false(ложь) если база данных не была открыта.

delete record

Универсальный англо-русский словарь . Академик.ру . 2011 .

Смотреть что такое «delete record» в других словарях:

record — I (New American Roget s College Thesaurus) Keeping as ev >English dictionary for students

Create, read, update and delete — In computer programming, create, read, update and delete (CRUD) are the four basic functions of persistent storage.[1] Sometimes CRUD is expanded with the words retrieve instead of read or destroy instead of delete. It is also sometimes used to… … Wikipedia

Minibus (record label) — Minibus Founded 2007 Founder Kakha Chikovani Genre Minimal Techno Tech House … Wikipedia

transcription — noun 1. something written, especially copied from one medium to another, as a typewritten version of dictation (Freq. 1) • Syn: ↑written text • Derivationally related forms: ↑transcribe • Hypernyms: ↑written communication, ↑ … Useful english dictionary

erase — verb 1) they erased his name Syn: delete, rub out, wipe off, blank out, expunge, excise, remove, obliterate 2) the data had been erased Syn: wipe, kill, delete … Synonyms and antonyms dictionary

UDR — United Dominion Realty Trust, Inc. (Business » NYSE Symbols) *** Ulster Defence Regiment (Governmental » Military) * Union Democracy Review (Community » Media) * Universal Data Repository (Computing » Databases) * Universal Drill Rigs (Business » … Abbreviations dictionary

Database trigger — A database trigger is procedural code that is automatically executed in response to certain events on a particular table or view in a database. The trigger is mostly used for keeping the integrity of the information on the database. For example,… … Wikipedia

Wikipedia:Japan-related topics notice board/New Japan-related articles — Please feel free to list newly created Japan related articles here. Any new articles that have an interesting or unusual fact in them should be suggested for the D >Wikipedia

SAP QM — is the quality management module of the SAP ERP software package from SAP AG. Quality manangement is integrated with other modules such as MM, PP, and SD. The QM module is comprised of the following components: quality planning, quality… … Wikipedia

Linked list — In computer science, a linked list is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of a datum and a reference (in other words, a link) to the next node in the… … Wikipedia

APOEL Nicosie — Infobox club sportif APOEL Nicosie … Wikipédia en Français


Access VBA code that delete records not working

hi guys i tried that code on access vba and it giving me error here is it :

1 Answer 1

VBA does not understand this code because it is written for VB.NET . If it is the first time you hear about VB.NET , think of it as an extension of VBA (this is a huge oversimplification and I hope I dont get downvoted because of writing such stuff :) ).

In VBA syntax you would do something like:

You do not need Resume in this context.

Have a look at this post as well, it is quite similar.

How to Connect to a Database and Add/Update/Delete Record

In this tutorial I will explain to you on how to connect to an Access database and allow you to Add/Update/Delete a record.

To fully understand these tutorials please download the source code How to Add/Update/Delete Record using MS Access Database.

This source code is part of the Hotel Reservation System that I am currently working.

At the end of this tutorial you will learn the basic of database programming. I would like, however, to emphasize especially for beginners that one way to learn programming is to know how to debug a program and devote some of your time to reading. Don’t be frightened on how short or long an article should be. The important is at the end of the tutorial you will learn something NEW! If you already know the topic, then don’t bother to study this again.

Table of Contents

  1. Introduction
  2. Let’s get started
  3. Database Connection
  4. Add and Update a Record
  5. Delete a Record
  6. Final Thoughts

Before I started learning VB.NET one of the topic that I search for in the internet is on how to connect to the database and make some changes to the table. Although there’s a lot of results, but I cannot find one that suit to my needs. Most of the tutorial is using drag and drop features of vb.net editor. Well, this is okay in most cases but what if you’d like to manipulate the data by code? So, I created this tutorial so that beginner programmer will learn from this.

Let’s get started

It is very important that you use your common sense to understand the logic of database programming. There’s a lot of features built-in to Visual Basic Editor that most programmer especially beginner who overlook it. One of the favorite tools I usually used is the DEBUGGER. If you only knew how important a debugger is, then you do not even need to study this tutorial. Why? Because you can jump right away to the source code and start firing the F8 command from your keyboard and analyze every line as you step through the code.

Anyway beginner is a beginner. You need to start from scratch. If you have already downloaded the source code, then open it in the visual basic .net editor by double clicking the “HowtoAddUpdateDeleteRecord.sln”. If you want to know what is the object that runs the first time you start the program (by pressing F5) then double click the “My Project” at the Solution Explorer. Look at the Startup Form.

You will see that the value is “frmCustomersList”. Now, click this object in the Solution Explorer and click the View Code at the toolbar. Look for the Load event similar below:

Private Sub frmCustomersList_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
sSql = «SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address FROM Customers ORDER BY CustomerID ASC»

FillListView(lvList, GetData(sSql))
End Sub

frmCustomersList_Load is the second procedure that runs when you hit the F5 Key from your keyboard. If you’d like to know how this code is executed then press F8.

Believe it or not F8 is the answer to all your programming question. And I really mean it. When I started programming all I do is to search for free source code and start using the debugging tool. That’s why Visual Basic is being named as Rapid Application Development or RAD.

If you follow the debugger the first line it executes is the Private Sub frmCustomersList_Resize( ByVal sender As Object , ByVal e As System.EventArgs) then followed by frmCustomersList_Load which is actually the important procedure to note here.

Another important debugging tool is “Toggle Breakpoint”. You will be prompted to your code if one of the line is marked by toggle break point. This can be done by pressing the F9 key or clicking the Debug menu then Toggle Breakpoint. This tool is important if the form is already loaded and you want to tract the execution of a code say within a command button.

For example. Open the form frmCustomersList and double click the add button and move the up arrow key once and press F9. You willl have a picture as shown below:

Now, when you run the program and click the Add button you will be directed to the code editor window. This case you will see what is happening when you are executing the program. Isn’t it nice?

Database Connection

In order to connect to the database you need a connection string like this:

Public Const cnString As String = «Prov >

Then open it by using this command:

Dim cnHotel As OleDbConnection

cnHotel = New OleDbConnection

If .State = ConnectionState.Open Then .Close()
.ConnectionString = cnString

You need this whether you use OleDbDataReader, ExecuteNonQuery or OleDbCommandBuilder to read or write into the database table. To know more about this class just click this command and press F1 key to open the help files. Be sure you installed the MSDN.

Since you have already open the connection to your database this is now the time to fill the ListView with data. This can be done by calling a function like:

The line of code will then execute a function:

‘Fill ListView control with data
Public Sub FillListView( ByRef lvList As ListView, ByRef myData As OleDbDataReader)
Dim itmListItem As ListViewItem
Dim strValue As String


Do While myData.Read

itmListItem = New ListViewItem()

strValue = IIf(myData.IsDBNull(0), «» , myData.GetValue(0))

For shtCntr = 1 To myData.FieldCount() — 1
If myData.IsDBNull(shtCntr) Then
itmListItem.SubItems.Add( «» )
Else
itmListItem.SubItems.Add(myData.GetString(shtCntr))
End If
Next shtCntr

Again in order to see how this code is being executed just run the program using the debugging tool (either F8 or F9).

The rest of the procedure is executed only when they are called. For example, the code below is executed only when you click the Add button.

Private Sub btnAdd_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
Dim Customer >As String

For Each sItem As ListViewItem In lvList.SelectedItems
Customer >
Next

Call FillList()
End Sub

This code will open the form frmCustomers in add mode and will execute also its own Load Event. If you want to open the form frmCustomers in edit mode, then just double click the item in a ListView.

The code being executed are:

Private Sub lvList_DoubleClick( ByVal sender As Object , ByVal e As System.EventArgs) Handles lvList.DoubleClick
Dim Customer >As String

For Each sItem As ListViewItem In lvList.SelectedItems
Customer >
Next

With frmCustomers
.State = gModule.FormState.adStateEditMode

Call FillList()
End With

The two procedure seems carry the same concept, by opening a form, except they vary on the button invoke for execution.

will tell the target form to open the connection to the database in add mode and

will open the database in edit mode.

Add and Update a Record

Now, how to save the data in textboxes within the form? This can be done by calling a procedure called btnSave_Click. This procedure is fired when the Save button is clicked.

Private Sub btnSave_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
Dim dt As DataTable = dsCustomers.Tables( «Customers» )

If txtCustomer >»» Or txtCompanyName.Text = «» Then
MsgBox( «Please fill up Customer ID or Company Name information.» , MsgBoxStyle.Critical)

Exit Sub
End If

Try
If State = gModule.FormState.adStateAddMode Then
‘ add a row
Dim newRow As DataRow

newRow( «CustomerID» ) = txtCustomerID.Text

dt.Rows.Add(newRow)
End If

With dt
.Rows(0)( «CustomerID» ) = txtCustomerID.Text
.Rows(0)( «CompanyName» ) = txtCompanyName.Text
.Rows(0)( «ContactName» ) = IIf(txtContactName.Text = «» , System.DBNull.Value, txtContactName.Text)
.Rows(0)( «ContactTitle» ) = IIf(txtContactTitle.Text = «» , System.DBNull.Value, txtContactTitle.Text)
.Rows(0)( «Address» ) = IIf(txtAddress.Text = «» , System.DBNull.Value, txtAddress.Text)
.Rows(0)( «City» ) = IIf(txtCity.Text = «» , System.DBNull.Value, txtCity.Text)
.Rows(0)( «Region» ) = IIf(txtRegion.Text = «» , System.DBNull.Value, txtRegion.Text)
.Rows(0)( «PostalCode» ) = IIf(txtPostalCode.Text = «» , System.DBNull.Value, txtPostalCode.Text)
.Rows(0)( «Country» ) = IIf(txtCountry.Text = «» , System.DBNull.Value, txtCountry.Text)
.Rows(0)( «Phone» ) = IIf(txtPhone.Text = «» , System.DBNull.Value, txtPhone.Text)
.Rows(0)( «Fax» ) = IIf(txtFax.Text = «» , System.DBNull.Value, txtFax.Text)

MsgBox( «Record successfully saved.» , MsgBoxStyle.Information)
End With

Catch ex As OleDbException
MsgBox(ex.ToString)
End Try
End Sub

The code for adding and updating a table is the same except that if you are in add mode you just simply add this command:

If State = gModule.FormState.adStateAddMode Then

‘ add a row
Dim newRow As DataRow

newRow = dt.NewRow()
newRow( «CustomerID» ) = txtCustomerID.Text

dt.Rows.Add(newRow)
End If

This way you do not need to create a separate command to insert and update a table.

Delete a Record

Let us go back to frmCustomersList form and delete a record. The procedure before will be fired after clicking a Delete button:

Private Sub btnDelete_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
Dim Customer >As String

For Each sItem As ListViewItem In lvList.SelectedItems
Customer >
Next


If CustomerID <> «» Then
‘Delete the selected record
Dim strDeleted As Boolean

strDeleted = ExecNonQuery( «DELETE Customers.Customer > & Customer >»‘» )

If strDeleted = «True» Then
MsgBox( «Record’s deleted.» , MsgBoxStyle.Information)

Call FillList()
Else
MsgBox(strDeleted)
End If
Else
MsgBox( «Please select record to delete.» , MsgBoxStyle.Critical)
End If
End Sub

The important line here is the

strDeleted = ExecNonQuery( «DELETE Customers.Customer > & Customer >»‘» )

which call the function ExecNonQuery and deletes a record based on the SQL Statement.

Final Thoughts

The above tutorial will simply teach you on how to connect to a database and make some changes to the database table.

It is very important that you read first some tutorials about programming before you dive into the source code if you’re just starting out.

If you really wanted to learn faster, then I recommend a book which is my reference also with this article. This book is called Beginning VB 2008 Databases: From Novice to Professional (Beginning: from Novice to Professional) . The advantage of this book because it teaches your more specific to database programming.

Функции Flashback и восстановление базы данных Oracle

Предлагаемая Oracle технология Flashback позволяет “перематывать” базу данных или какие-то из ее частей до определенного момента времени в прошлом, не прибегая к традиционным, более длительным приемам восстановления, которые предусматривают использование файлов резервных копий и архивных журналов повторного выполнения.

Часто она оказывается быстрым и эффективным средством восстановления после логических повреждений или ошибок пользователей.

Преобразование SCN-номеров в значения TIMESTAMP и наоборот

Для преобразования SCN-номеров в соответствующие значения TIMESTMAP и наоборот доступны две специальных SQL-функции — SCN_TO_TIMESTAMP и TIMESTAMP_TO_SCN . Функция SCN_TO_TIMESTAMP позволяет преобразовывать SCN в календарное значение ( TIMESTAMP ).

Функция TIMESTAMP_TO_SCN выполняет противоположное SCN_TO_TIMESTAMP действие, т.е. преобразует календарное значение ( TIMESTAMP ) в соответствующий SCN-номер.

Для указания точной точки, до которой требуется выполнить восстановление, можно использовать как значение времени (часы, минуты, секунды), так и SCN-номер. В случае применения значения времени Oracle будет выбирать SCN-номер, находящийся в пределах трех секунд от этого значения. Oracle сохраняет отображение между указываемыми значениями времени и SCN-номерами на протяжении периода, который указан в параметре UNDO_RETENTION .

Уровни Flashback

Функции Flashback можно использовать как на уровне отдельных строк и таблиц, так и на уровне всей базы данных, как объясняется далее.

  • Уровень строк. Функции Flashback можно применять для отмены ошибочных изменений в отдельных строках. Существуют четыре функции Flashback, которые можно применять на уровне отдельных строк, и действие всех их основано на использовании данных отмены, хранящихся табличном пространстве отката. Ниже перечислены эти функции.
  • Функция Flashback Query (функция ретроспективного запроса). Позволяет просматривать старые данные строк на основе указанного момента во времени или SCN-номера. Более старые данные можно не только просматривать, но и при необходимости извлекать и отменять внесенные в них по ошибке изменения.
  • Функция Flashback Versions Query (функция ретроспективного запроса версий строки). Позволяет просматривать все версии одной и той же строка за определенный период и, если необходимо, отменять логические ошибки. Может также предоставлять хронологию аудита изменений и тем самым, по сути, позволять сравнивать настоящие данные со старыми без выполнения DML-операций.
  • Функция Flashback Transaction Query (функция ретроспективного запроса транзакций). Позволяет просматривать изменения, внесенные на уровне отдельных транзакций. Помогает при осуществлении анализа и аудита транзакций, например, при двукратном выполнении пакетного задания и необходимости определить, какие объекты пострадали. С помощью этой функции можно легко отменять изменения, внесенные целой транзакцией за определенный период времени.
  • Функция Flashback Transaction Backout (функция ретроспективной отмены транзакций). Позволяет отменять транзакции вместе со всеми ее зависимыми транзакциями одним щелчком.
  • Уровень таблиц. Существуют две основных функции Flashback, которые можно применять на уровне отдельных таблиц.
  • Функция Flashback Table (функция ретроспективного отката таблицы). Позволяет восстанавливать таблицу до определенного момента времени в прошлом или до определенного SCN-номера без выполнения восстановления файлов данных. Для отмены изменений в таблице использует DML-изменения. Работает за счет применения данных отмены.
  • Функция Flashback Drop (функция ретроспективного отката удаления). Позволяет отменять действие оператора DROP TABLE без выполнения процедуры восстановления до состояния на определенный момент времени в прошлом (PITR). Для восстановления удаленной таблицы использует корзину (Recycle Bin).
  • Уровень базы данных. Функция Flashback Database (функция ретроспективного отката базы данных) позволяет восстанавливать всю базу данных до состояния на определенный момент времени в прошлом и тем самым отменять все произошедшие с того времени изменения. Например, с ее помощью можно легко восстанавливать удаленную схему или усеченную по ошибке таблицу. Она работает в основном за счет использования журналов ретроспективного отката для извлечения более старых версий блоков данных, а также, в некоторой степени, за счет использования архивных журналов повторного выполнения для полного восстановления базы данных без восстановления файлов данных и проведения традиционной процедуры восстановления носителя.

Как видно, предлагаемая Oracle технология Flashback состоит из разных функций. Функция Flashback Table и все работающие на уровне строк функции Flashback основаны на использовании данных отката и потому рассматривались в главе 6. Еще, однако, существует механизм Flashback Data Archive (Архив ретроспективных данных), который позволяет хранить и отслеживать транзакционные изменения в данных таблицы. Его можно применять для запросов, предусматривающих извлечение хронологических данных, или для удовлетворения требований по соблюдению законодательных норм. Функции Flashback Drop и Flashback Database полагаются на новую концепцию корзины и данных журнала ретроспективного отката и служат для отмены ошибок на различных уровнях. Они более подробно рассматриваются позже в этой главе.

Функции Flashback и традиционные приемы восстановления

В отличие от традиционных приемов восстановления, функции Flashback рассчитаны главным образом не на выполнение восстановления после потери носителя, а на выполнение восстановления после человеческих ошибок. Например, может происходить случайное изменение не того набора данных или удаление таблицы, либо просто возникать необходимость в выполнении запроса к хронологическим данным и проведении анализа изменений. В некоторых крайних случаях может также возникать потребность в возврате всей базы данных в состояние, в котором она пребывала в какой-то момент времени в прошлом.

На заметку! В случае повреждения диска или появления в базе данных физического (а не логического, связанного с ошибками приложений или пользователей) повреждения, необходимо все равно использовать традиционные методы восстановления из резервных копий и применять архивные журналы повторного выполнения для приведения базы данных в актуальное состояние.

Раньше единственным способом для выполнения восстановления после человеческой ошибки было применение традиционных приемов резервного копирования и восстановления. Процесс восстановления файлов базы данных и последующего наката до актуального состояния с помощью данных всех журналов повторного выполнения, однако, часто выливался в серьезные периоды простоя, а технология Flashback предлагает гораздо более эффективный и быстрый способ выполнения восстановления, в большинстве случаев позволяющий не переводить базу данных в автономный режим и оставлять ее доступной для пользователей. Более того, она еще позволяет выполнять выборочное восстановление только определенных объектов. В случае применения традиционных приемов администратору баз данных не остается никакого выбора, как выполнять восстановление всей базы данных.

Функция Flashback Drop

Функция Flashback Drop представляет собой средство для восстановления случайно удаленной таблицы (и ее индексов) без потери недавних транзакций. Большинству опытных администраторов наверняка приходилось сталкиваться с ситуациями случайного удаления какой-нибудь производственной таблицы. Выполнение оператора DROP TABLE происходит за считанные секунды, приглашение SQL возвращается после него очень быстро, а вот его последствия могут оказываться ужасными. К сожалению, никакого приглашения подтвердить намерение удалить таблицу перед тем, как она исчезнет, не отображается!

Начиная с Oracle Database 10g, при удалении таблицы Oracle не избавляется от нее немедленно. Вместо этого таблица вместе с любыми зависящими от нее объектами перечисляется в корзине (о которой более подробно будет рассказываться чуть позже) и хранится настолько долго, насколько возможно. В случае быстрого обнаружения, что была допущена ошибка, для немедленного восстановления удаленной таблицы можно применить следующую простую команду:

Совет. Одним из наилучших способов для исключения вероятности случайного удаления таблицы является использование в SQL*Plus новых влияющих на вид приглашения переменных, позволяющих делать так, чтобы в приглашении отображалось имя используемой базы данных и имя пользователя. Более подробно об этих переменных рассказывалось в этой статье.

Как работает функция Flashback Drop

До выхода Oracle Database 10g выполнение команды DROP TABLE приводило к немедленному удалению таблицы и всех ее зависимых объектов и возвращению всего пространства, которая она занимала, обратно базе данных.

Начиная с Oracle Database 10g, однако, таблица и ее зависимые объекты больше не удаляются немедленно. Вместо этого они переименовываются и временно остаются в том же самом месте, где Oracle хранит их настолько долго, насколько получается, в зависимости от возникающих потребностей в пространстве. Как уже отмечалось ранее, все такие “удаленные” объекты перечисляются в корзине (Recycle Bin), которая представляет собой логический контейнер (таблицу словаря данных, в которой хранится информация об удаленных таблицах, наподобие их новых и исходных имен). Содержимое корзины можно просматривать, как и содержимое любой обычной таблицы, выполняя к ней простой запрос SELECT * FROM DBA_RECYCLEBIN . Пока таблица все еще перечисляется в корзине, ее можно восстанавливать в любое время с помощью функции Flashback Drop.

Совет. После выхода версии Oracle Database 10g Release 2 появилась возможность использовать параметр инициализации RECYCLEBIN для отключения функции Flashback Drop. По умолчанию для этого параметра установлено значение ON, при котором все удаляемые таблицы попадают в корзину и могут восстанавливаться позже с помощью функции Flashback Drop. За счет установки для этого параметра значения OFF можно отключить функцию Flashback Drop и таблицы при удалении помещаться в корзину не будут.

Выполнение запроса к представлению DBA_FREE_SPACE будет показывать, что пространство, которое ранее занимали “удаленные” объекты, теперь свободно. На самом деле, однако, это пространство не становится немедленно доступным для использования в базе данных: оно представляет собой потенциально свободное пространство, которое сможет применяться в базе данных позже, как только данные объекты будут удалены навсегда. Следовательно, несмотря на то, что сообщается в представлении DBA_FREE_SPACE , “удаленные” объекты будут продолжать занимать исходное выделенное для них место в табличных пространствах до тех пор, пока не будут безвозвратно удалены из корзины. Это удаление может произойти при следующих обстоятельствах.

  • В случае безвозвратного удаления объектов из корзины пользователем с помощью команды PURGE ( DROP TABLE имя_таблицы PURGE );
  • В случае автоматического удаления этих объектов из корзины Oracle из-за нехватки пространства, т.е. при отсутствии достаточного количества свободного места в табличном пространстве для создания нового объекта или расширения пространства, занимаемого существующим объектом.

Совет. В базе данных Oracle Database 11g функция Flashback Drop включена автоматически. Для ее использования ничего конфигурировать не требуется.


Из всего вышесказанного следует, что при выполнении команды DROP TABLE (или DROP INDEX ) в Oracle Database 11g запрашиваемые объекты на самом деле не удаляются. Oracle просто скрывает их, и потому их можно восстанавливать позже с помощью функции Flashback Drop. При желании действительно навсегда удалить какой-нибудь объект, можно указать в команде DROP параметр PURGE :

Давайте рассмотрим весь этот процесс немного более детально.

Корзина

Как уже упоминалось ранее, корзина (Recycle Bin) представляет собой логическую структуру, а точнее — таблицу, которая хранится в словаре данных RECYCLEBIN$ . Просматривать содержимое корзины на уровне подключенного к системе в текущий момент пользователя можно через представление USER_RECYCLEBIN (по сути, RECYCLEBIN является синонимом USER_RECYCLEBIN ), а просматривать ее содержимое на уровне всей базы данных — через представление DBA_RECYCLEBIN . Ниже приведен пример.

На уровне пользователя выборка данных осуществляется не из представления DBA_RECYCLEBIN , а из представления RECYCLEBIN . Кроме того, для просмотра содержимого корзины в сеансе SQL*Plus можно использовать команду SHOW RECYCLEBIN :

Совет. Столбцы CAN_UNDROP и CAN_PURGE в представлении DBA_RECYCLEBIN показывают, можно ли, соответственно, отменить удаление объекта и удалить его навсегда. Команда SHOW RECYCLEBIN отображает лишь те объекты, удаление которых можно отменить (undrop).

Как не трудно заметить, при перемещении таблицы в корзину Oracle присваивает ей генерируемое системой имя, которое обычно составляет 30 символов в длину. При желании выполнить запрос к объекту в корзине, нужно обязательно использовать такое сгенерированное системой имя, заключая его в двойные кавычки:

На заметку! Объекты в корзине можно только запрашивать с помощью команды SELECT . Команды INSERT, UPDATE и DELETE работать не будут.

Oracle переименовывает все без исключения объекты в корзине, в том числе и любые зависимые объекты, вроде индексов, ограничений и триггеров. При восстановлении таблицы Oracle будет восстанавливать и зависимые объекты тоже, но у них будут оставаться такие непонятные сгенерированные системой имена, из-за чего их нужно будет снова переименовывать соответствующим образом.

Для выяснения того, какие таблицы в текущий момент находятся в корзине, можно выполнить запрос к представлению DBA_TABLES . Таблица, которая была удалена и находится в корзине, будет иметь в столбце DROPPED значение YES , а все остальные — значение NO .

Восстановление удаленной таблицы

Любую удаленную таблицу можно восстановить, если она находится в корзине, с помощью команды FLASHBACK TABLE имя_таблицы TO BEFORE DROP (которая будет приводить не только к восстановлению таблицы, но и к ее удалению из корзины). Ниже приведен пример восстановления удаленной ранее таблицы persons :

В качестве альтернативного варианта, можно также использовать и сгенерированное системой имя таблицы:

При желании удаленную ранее таблицу можно переименовать как часть операции FLASHBACK (и в этом случае тоже можно указывать как сгенерированное системой, так и исходное имя таблицы):

Подобное особенно удобно, когда в системе уже была создана новая таблица с таким же именем, что и у удаленной таблицы.

В случае удаления таблицы, а затем создания новой с таким же именем и потом удаления и ее тоже, в корзине может содержаться несколько версий удаленной таблицы с уникальным сгенерированным системой именем у каждой. Выполнение команды FLASHBACK TABLE. TO BEFORE DROP с использованием исходного имени таблицы тогда будет приводить к восстановлению самой последней версии этой таблицы. Если необходимо вернуться к какой-то более старой версии, можно либо выполнять одну и ту же команду до тех пор, пока не будет восстановлена требуемая версия, либо сразу предоставить уникальное сгенерированное системой имя конкретно той версии, которую нужно восстановить.

Безвозвратное удаление таблиц

Как уже упоминалось ранее, при желании удалить таблицу немедленно и навсегда, без ее помещения в корзину, нужно использовать команду DROP TABLE имя_таблицы PURGE :

Совет. Новая конструкция PURGE оказывается особенно удобной, когда требуется удалить какую-то секретную таблицу и ради безопасности нельзя, чтобы она попала корзину.

С помощью команды PURGE TABLE или PURGE INDEX можно безвозвратно стереть удаленную ранее таблицу или индекс из корзины:

В качестве альтернативного варианта, можно также использовать и сгенерированное системой имя:

При наличии в корзине нескольких таблиц с одинаковым исходным именем, команда PURGE будет приводить к удалению первой таблицы, которая была исходно удалена.

На заметку! После удаления объекта из корзины с помощью команды PURGE или указании при удалении объекта параметра PURGE , применять потом функцию FLASHBACK DROP для извлечения этого объекта (или любых зависимых от него объектов) нельзя, потому что удаляемые подобным образом объекты удаляются навсегда.

С помощью команды PURGE TABLESPACE можно удалить из корзины все объекты, которые являются частью определенного табличного пространства:

Следующая команда приведет к удалению из табличного пространства users всех объектов, принадлежащих одному только пользователю scott (вместе с любыми зависимыми от них объектами, которые находятся в других табличных пространствах):

Для безвозвратного удаления всех объектов из табличного пространства, не помещая их в корзину, можно использовать команду DROP TABLESPACE. INCLUDING CONTENTS . В таком случае помимо этих объектов будут также навсегда удаляться и любые принадлежащие данному табличному пространству объекты, которые в текущий момент уже находятся в корзине. Выполнение команды DROP TABLESPACE самой по себе, т.е. без конструкции INCLUDING CONTENTS , будет завершаться ошибкой, если только табличное пространство не является пустым.

Чтобы навсегда удалить все объекты, которые в текущий момент находятся в корзине, можно воспользоваться командой PURGE RECYCLEBIN (или PURGE USER_RECYCLEBIN ).

Эти команды будут приводить к удалению лишь тех объектов, которые принадлежат запустившему их пользователю. Для того чтобы очистить корзину от всех объектов, независимо от того, кому они принадлежат, можно применить команду PURGE DBA_RECYCLEBIN . Однако по вполне очевидным причинам для выполнения этой команды требуется обладать привилегиями SYSDBA .

На заметку! Команда DROP USER. CASCADE указывает Oracle, что нужно удалить пользователя и все объекты, которыми он владеет, из базы данных, и будет автоматически приводить к безвозвратному удалению принадлежащих этому пользователю объектов из корзины.

И, наконец, не следует забывать о том, что Oracle может автоматически удалять объекты из корзины в случае нехватки пространства. Удаление всегда начинается с самых старых объектов.

Необходимые права

Для извлечения таблицы с помощью команды FLASHBACK TABLE имя_таблицы TO BEFORE DROP требуется либо быть владельцем этой таблицы, либо обладать привилегиями на выполнение в ней операций удаления ( DROP TABLE или DROP ANY TABLE ). Чтобы использовать команду PURGE , нужно иметь похожие привилегии. Для выполнения запроса к объекту, уже находящему в корзине, требуется обладать привилегией SELECT и привилегией FLASHBACK на уровне этого объекта.

Функция Flashback Database

До выхода Oracle Database 10g, в случае появления логического повреждения в базе данных, требовалось прибегать к традиционным приемам восстановления до состояния на определенный момент времени, восстанавливать файлы данных из резервных копий и потом применять архивные журналы повторного выполнения для приведения базы данных в актуальное состояние. Это зачастую отнимало много времени и усилий. Каким бы незначительным не был масштаб повреждения, все равно требовалось выполнять восстановление всех файлов данных и применять архивные журналы повторного выполнения.

На заметку! Oracle может проверять целостность блоков данных за счет вычисления для них контрольных сумм перед их записью на диск и при их последующем считывании. Несовпадение исходной и текущей контрольной суммы блока свидетельствует о том, что, скорее всего, в нем присутствует повреждение. Установив для параметра инициализации DB_BLOCK_CHECKSUM значение FULL , можно заставить базу данных выполнять такую проверку в самом кэше буферов и тем самым исключать вероятность возникновения повреждений на уровне физического диска. По умолчанию для параметра DB_BLOCK_CHECKSUM устанавливается значение FALSE .

Функция Flashback Database позволяет восстанавливать файлы данных без выполнения их восстановления из резервных копий и с использованием лишь части информации журналов повторного выполнения. Она просто возвращает все файлы базы данных в состояние, в котором они находились на определенный момент времени в прошлом. В случае использования этой функции время восстановления напрямую зависит от количества изменений, которые требуется отменить. Следовательно, решающую роль в том, сколько времени занимает процесс восстановления, играет масштаб ошибки, а не размер базы данных. Это означает, что справляться с восстановлением после логических ошибок можно лишь за часть того времени (возможно, даже, в зависимости от размера базы данных, лишь за сотую долю того времени), которое пришлось бы потратить в случае применения традиционных методов.

На заметку! Применять функцию Flashback Database допускается только при отсутствии проблем с носителем. В случае потери или повреждения файла данных придется выполнять восстановление с использованием резервных копий.

Функцией Flashback Database можно пользоваться в следующих ситуациях:

  • когда необходимо извлечь какую-нибудь удаленную схему;
  • когда ошибка пользователя оказывает негативное воздействие на всю базу данных;
  • когда таблица была усечена по ошибке;
  • когда пакетное задание вносит только частичные изменения.


Функция Flashback Database использует журналы ретроспективного отката базы данных (flashback database logs), которые хранятся в новой области пакетного восстановления, для отмены изменений вплоть до момента, идущего непосредственно перед указанным целевым временем или SCN-номером. Поскольку указываемое целевое и фактическое время восстановления могут немного отличаться, далее применяются архивные журналы повторного выполнения для записи в базу данных изменений, которые успели произойти в том коротком промежутке между целевым и фактическим временем восстановления.

После включения функции Flashback Database для выполнения возвращения базы данных до какого-то предыдущего момента во времени, SCN-номера или порядкового номера журнала достаточно выдать команду FLASHBACK DATABASE. Выполнять команду FLASHBACK DATABASE можно как в RMAN, так и в SQL*Plus. Единственное отличие состоит в том, что RMAN будет автоматически извлекать все необходимые архивные журналы повторного выполнения, в то время как в SQL*Plus может потребоваться предоставлять эти журналы самостоятельно, если только в SQL*Plus не была включена функция SET AUTORECOVERY ON .

Чуть позже мы обязательно посмотрим, как функция Flashback Database выглядит в действии, но сначала давайте разберемся с тем, как она включается и отключается.

Совет. Из-за необходимости иметь в наличии текущие файлы данных для того, чтобы применять к ним изменения, применять функцию Flashback Database в случае повреждения или потери файлов нельзя.

Конфигурирование функции Flashback Database

Чтобы сконфигурировать функцию Flashback Database, потребуется выполнить ряд действий.

1. Удостоверьтесь в том, что база данных находится в режиме архивирования журналов ( ARCHIVELOG ), либо выполнив запрос к представлению V$DATABASE , либо воспользовавшись следующей командой:

В показанном выше выводе видно, что база данных действительно функционирует в режиме ARCHIVELOG . Если это не так, включить режим архивирования журналов можно с помощью оператора ALTER DATABASE , как показано ниже, сначала остановив базу данных и запустив ее заново в режиме монтирования:

2. Настройте область пакетного восстановления, как было описано в главе 15.

3. Установите параметр инициализации DB_FLASHBACK_RETENTION_TARGET так, чтобы он указывал, насколько далеко назад можно будет выполнять ретроспективный откат базы данных. В следующем коде для него устанавливается значение 1440 (означающее 1440 минут, т.е. 1 день):

4. Остановите и перезапустите базу данных в монопольном режиме монтирования. Если существует только один экземпляр, можно применить и просто команду MOUNT :

5. Включите функцию Flashback Database:

6. Откройте базу данных с помощью команды ALTER DATABASE OPEN и затем удостоверьтесь в том, что функция Flashback Database действительно включена, выполнив запроса к представлению V$DATABASE :

Более простой путь предполагает использование для настройки функции Flashback Database интерфейса OEM Database Control и выполнение в нем перечисленных ниже шагов (при условии, что база данных функционирует в режиме ARCHIVELOG ).

  1. Отобразите домашнюю страницу базы данных (Database Home Page) и щелкните на вкладке Maintenance (Сопровождение).
  2. Перейдите в раздел Backup/Recovery (Резервное копирование/Восстановление) и щелкните на ссылке Configure Recovery Settings (Сконфигурировать параметры восстановления).
  3. В разделе Flash Recovery Area (Область пакетного восстановления) укажите значения в полях Flash Recovery Area Location (Размещение области пакетного восстановления) и Flash Recovery Area Size (Размер области пакетного восстановления).
  4. Отметьте флажок рядом с опцией Enable Flashback Database — flashback logging can be used for fast database point-in-time recovery (Включить функцию ретроспективного отката базы данных — журналы ретроспективного отката могут применяться для выполнения быстрого восстановления базы данных до состояния на определенный момент в прошлом), как показано на рисунке ниже:

Отключение функции Flashback Database

Отключить функцию Flashback Database можно посредством команды ALTER DATABASE FLASHBACK OFF . Перед использованием этой команды, однако, сначала нужно обязательно остановить экземпляр базы данных и перезапустить его в режиме монтирования (или монопольном режиме монтирования):

Совет. При отключении функции Flashback Database все журналы Flashback Database будут удалены из области пакетного восстановления.

При желании использовать функцию Flashback Database, но только не для определенных табличных пространств, можно отключить ее на уровне этих пространств с помощью команды ALTER TABLESPACE :

После отключения этой функции подобным образом Oracle больше не будет сохранять в журналах данные Flashback Database для конкретного табличного пространства. Если нужно включить эту функцию для данного пространства снова, достаточно просто выполнить такую команду:

Как объяснялось в главе 5, создавать табличное пространство с отключенной функцией Flashback можно указанием при создании табличного пространства конструкции FLASHBACK OFF . По умолчанию эта функция включена.

Понятия, связанные с работой функции Flashback Database

После включения функции Flashback Database также активизируется и новый фоновый процесс RVWR (Recovery Writer — процесс записи данных восстановления). Этот процесс, через нечастые промежутки времени, чтобы сократить нагрузку на ЦП и средства ввода-вывода, копирует предыдущий образ (before-image) каждого изменившегося в файлах данных блока из буфера памяти (буфера ретроспективных данных) в журналы ретроспективного отката базы данных, которые хранятся в области пакетного восстановления. Область пакетного восстановления представляет собой область, которая специально выделяется на диске под хранение имеющих отношение к восстановлению компонентов, наподобие упомянутых копий образов, инкрементных резервных копий и архивных журналов повторного выполнения.

На заметку! Для повышения пропускной способности диска в Oracle рекомендуют использовать для областей пакетного восстановления быстро работающие файловые системы и множественные дисководы со слоями небольшого размера (128 Кбайт).

Журналы ретроспективного отката базы данных (Flashback Database) похожи на традиционные используемые Oracle журналы повторного выполнения (в те и другие запись данных выполняется из области буфера), но имеют одно серьезное отличие, которое состоит в том, что архивных журналов ретроспективного отката базы данных не бывает! Oracle всегда сохраняет все журналы ретроспективного отката базы данных в области пакетного восстановления.

На заметку! Для выполнения операции ретроспективного отката базы данных необходимо обладать привилегиями SYSDBA .

Предыдущие образы блоков данных можно использовать для воссоздания файла данных в том виде, в котором он существовал на определенный момент времени в прошлом. По сути, с их помощью можно отменять любые изменения, которые были внесены в файл данных после указанного целевого момента времени. В действительности журналы Flashback Database применяются для выполнения восстановления до момента, который непосредственно предшествовал указанному целевому времени. После этого Oracle использует традиционные архивные журналы для записи любых изменений, которые успели произойти за короткий промежуток между целевым и фактическим временем восстановления.

Например, при желании выполнить ретроспективный откат до 9:00, может оказаться, что ближайшая к целевому времени запись данных в журналы Flashback Database была выполнена в 8:57. Тогда, следовательно, чтобы охватить этот трех- или четырех-минутный промежуток, потребуется обязательно применить изменения из архивных или оперативных журналов повторного выполнения. Из-за этого, хотя традиционная процедура PITR, подразумевающая использование резервных копий и файлов архивных журналов повторного выполнения, и не выполняется, наличие доступа к журналам повторного выполнения за весь период времени, охватываемый журналами Flashback Database, все равно является обязательным.

При непосредственном выполнении команды FLASHBACK DATABASE Oracle сначала проверяет, доступны ли требуемые файлы архивных и оперативных журналов повторного выполнения, и если да, тогда автоматически возвращает все текущие оперативные файлы данных к указанному в этой команде SCN-номеру или времени.

Совет. Время, необходимое для выполнения ретроспективного отката базы данных, зависит от того, насколько далеко назад требуется вернуться, и какое количество изменений в блоках данных успело произойти за этот промежуток времени. В базе данных, которая интенсивно используется для выполнения DML-операций, будет больше изменений в блоках данных, чем, в той, которая применяется в основном для обслуживания запросов.

Ограничения, касающиеся хранения журналов Flashback Database

Следует помнить о том, что Oracle не гарантирует возможности выполнения обратного отката базы данных на такое количество времени назад, которое указано в параметре инициализации FLASHBACK_RETENTION_TARGET (каковое в примере составляет один день). Если Oracle перестанет хватать свободного пространства в области пакетного восстановления, будут удаляться более старые журналы ретроспективного отката для высвобождения места под поступающие новые резервные копии файлов данных, архивные файлы журналов повторного выполнения или любые другие связанные с резервным копированием файлы, которые являются частью области пакетного восстановления.

Более того, как отмечалось ранее, область пакетного восстановления выделяется специально под хранение файлов, имеющих отношение к восстановлению. Из-за этого база данных ставит хранение таких связанных с восстановлением файлов выше сбережения журналов Flashback Database. Следовательно, при необходимости уместить в области пакетного восстановления какие-то другие файлы, имеющие отношение к восстановлению, Oracle будет автоматически удалять журналы Flashback Database.

Поэтому очень важно следить за размером области пакетного восстановления и проверять, чтобы в ней всегда хватало пространства, чтобы не подвергаться риску потери журналов Flashback Database, которые могут потребоваться для выполнения восстановления базы данных в будущем.

На заметку! Допускается создавать гарантированную точку восстановления для уверенности в том, что Oracle будет всегда продолжать хранить журналы Flashback Database и журналы повторного выполнения, необходимые для выполнения ретроспективного отката базы данных до указанного момента времени. Более подробно о точках восстановления и гарантированных точках восстановления в том числе будет рассказываться позже в этой главе, в разделе “Использование точек восстановления”.

Объем пространства, который необходимо выделять для области пакетного восстановления, зависит от значения, которое устанавливается для параметра DB_FLASHBACK_RETENTION_TARGET . После того, как база данных поработает с включенной функцией Flashback Database приличное количество времени (достаточное для того, чтобы удалось зафиксировать типичную рабочую нагрузку и частоту выполнения в базе данных операций по изменению данных), объем требуемого пространства можно оценивать путем выполнения запроса к представлению V$FLASHBACK_DATABASE_LOG , как показано ниже:

Хотя этот запрос и помогает оценить требуемый объем пространства для журналов Flashback Database, нет никакой гарантии, что этого пространства будет хватать.


Для выяснения того, насколько далеко назад получится выполнить откат базы данных в любой заданный момент времени, можно выдать такой запрос:

Если результат покажет, что выполнение отмотки базы данных до времени, указанного в параметре DB_FLASHBACK_RETENTION_TARGET , невозможно, следует задуматься об увеличении размера области пакетного восстановления.

Представление V$FLASHBACK_DATABASE_STAT позволяет следить за любыми отклонения в генерации данных Flashback на протяжении дня. На основании предоставляемых этим представлением статистических данных очень удобно регулировать значение параметра RETENTION_TARGET , размер области пакетного восстановления либо то и другое вместе.

Функция Flashback Database на примере

Теперь можно посмотреть, как функция Flashback Database выглядит в действии на реальном примере. Здесь используются команды SQL, но при желании все описываемые шаги можно выполнять и с помощью утилиты RMAN. Для начала в данном примере предлагается создать таблицу persons и загрузить в нее тестовые данные. Необходимые для этого шаги перечислены ниже.

1. Создайте таблицу:

2. Получите информацию об общем количестве строк в новой таблице:

3. Узнайте, как выглядит текущий SCN-номер базы данных:

4. Выполните оператор INSERT для удваивания строк в таблице persons , как показано ниже:

5. Удостоверьтесь в том, что данные были действительно вставлены, следующим образом:

Далее предположим, что требуется выполнить откат базы данных до того времени, когда в таблице persons содержалось еще 32768 строк. По сути, это означает, что необходимо вернуться к SCN-номеру 5965123 . Соответствующие шаги выглядят следующим образом.

1. Остановите базу данных Oracle и запустите ее снова в монопольном режиме монтирования, как показано ниже:

На заметку! Для применения функции Flashback Database обязательно нужно, чтобы база данных функционировала в режиме монтирования.

2. Выполните следующую простую команду FLASHBACK DATABASE :

Обратите внимание, что конструкция TO SCN подразумевает возврат базы данных к состоянию, в котором она находилась при указанном SCN-номере. Однако базу данных также можно возвращать и к состояния, в котором она пребывала непосредственно перед получением указанного SCN-номера, с помощью конструкции TO BEFORE SCN . Вдобавок можно использовать конструкции TO TIMESTAMP или TO BEFORE TIMESTAMP и возвращать базу данных к состоянию, в котором она находилась, соответственно, на какой-то определенный момент времени в прошлом и непосредственно за секунду до наступления этого момента.

3. Попробуйте открыть базу данных, чтобы выдать запрос к таблице persons :

Как видно, попытка открыть базу данных не удалась: для получения к откатанной базе данных доступа по записи потребуется повторить попытку с использованием оператора ALTER DATABASE OPEN RESETLOGS . Однако перед этим не помешает сначала открыть базу данных с помощью оператора ALTER DATABASE OPEN READ ONLY , удостоверившись в том, что ретроспективный откат базы данных был выполнен до корректной точки во времени или до правильного SCN-номера. Если после такой первоначальной проверки в режиме только для чтения окажется, что ретроспективный откат был выполнен слишком далеко назад в прошлое, можно воспользоваться журналами повторного выполнения и промотать базу данных немного вперед, а если окажется, что откат был выполнен недостаточно далеко назад, можно снова выдать команду FLASHBACK DATABASE и указать в ней более ранний SCN-номер.

Только после обретения полной уверенности в том, что ретроспективный откат был выполнен до времени, которое требовалось, можно финализировать этот процесс с помощью следующей команды:

4. Удостоверьтесь в том, что ретроспективный откат базы данных прошел надлежащим образом:

В качестве альтернативного варианта, вместо SCN-номера для указания желаемой точки ретроспективного отката можно также использовать порядковый номер архивного журнала или значение времени, например:

Независимо от того, указывается SCN-номер, значение времени или порядковый номер журнала, после получения уверенности в том, что база данных была точно восстановлена до требуемого состояния, ее можно сделать доступной для пользователей, выполнив следующую команду:

После этого база данных будет отражать состояние, в котором пребывала на момент использования прежнего SCN-номера или значения времени, которое было выбрано. Изменений, которые были внесены в нее после этого момента, больше не будет.

В случае если состояние базы данных после проведения операции Flashback Database по какой-то причине не понравится, с помощью приведенной ниже команды можно отменить результат всей операции Flashback:

Эта команда RECOVER DATABASE выполнит процедуру полного восстановления базы данных, применив все изменения, о которых имеются сведения в архивных журналах повторного выполнения, и снова приведет базу данных в актуальное состояние.

В случае если вдруг окажется, что ретроспективный откат базы данных был выполнен в первый раз недостаточно далеко назад, можно выполнить команду FLASHBACK DATABASE снова и вернуть базу данных еще немного назад.

В случае же если окажется, что ретроспективный откат базы данных был выполнен дальше, чем требовалось, можно воспользоваться командой RECOVER DATABASE UNTIL и вернуть базу данных немного вперед.

Особенности функции Flashback Database

В завершение этого раздела следует перечислить несколько ограничений, о которых нужно обязательно помнить при использовании функции Flashback Database.

  • База данных должна обязательно функционировать в режиме архивирования журналов ( ARCHIVELOG ).
  • В случае утери файла данных или невозможности использовать его по какой-то причине, применять для его восстановления функцию Flashback Database нельзя.
  • Если на протяжении периода, на который требуется выполнить ретроспективный откат назад, выполнялось восстановление или воссоздание управляющего файла, применять функцию Flashback Database нельзя.
  • Выполнять ретроспективный откат базы данных до состояния, в котором она находилась непосредственно перед проведением операции RESETLOGS , нельзя.
  • Выполнять ретроспективный откат файла данных, который сжимался или удалялся во время охватываемого операцией Flashback Table периода времени, нельзя.

На заметку! Начиная с версии Oracle Database 10g Release 2, функцию Flashback Database можно применять для выполнения возврата за пределами операции OPEN RESETLOGS и, следовательно, возвращать текущую базу данных к состоянию предшествующей или родственной инкарнации.

Как удалить записи базы данных со страницы jsp?

Следующий код является частью моего проекта, и вывод этого кода заключается в том, что я получаю все заголовки записей в базе данных и гиперссылку delete перед всеми enteries. Когда я нажимаю delete для соответствующего заголовка, его следует удалить с jsp-страницы. Как написать код для этого?

Идеальный способ сделать это — переместить всю логику в сервлет. Этот метод, о котором я упоминал ниже, не рекомендуется по многим причинам, которые вы узнаете, когда приобретете больше опыта. Однако пока предположим, что вы собираетесь использовать только JSP. Существует много способов сделать это, но это один из способов.

Этот метод использует два JSPS, первый JSP для отображения записей. Второй JSP — это JSP обработки, который сделает удаление для вас.

Подробнее см. ниже.

Первый JSP отобразит записи. Второй JSP вызывается, когда вы нажимаете «delete».

Второй JSP удалит запись, а затем перенаправит обратно в первый JSP. Это очень неэффективный способ сделать это и не рекомендуется. Но это быстро и грязно и сэкономит ваше время от создания сервлета, файлов Java и т.д.

JSP1.jsp будет иметь тот же код, что и вы. также получить первичный ключ записи. Это будет использоваться для идентификации записи, которая должна быть удалена. Этот id будет передан как параметр во второй JSP.


JSP2.jsp
Извлеките параметр из запроса. Затем выполните запрос Delete для этого идентификатора. Затем переадресовываем обратно в JSP1.

Этот метод не рекомендуется, но вы получаете представление о том, что нужно сделать.

Что такое код dbase_delete_record

VVitafresh » 26.12.2005 (Пн) 22:05

Нужно из *.dbf файла удалить все записи.
Пробую таким способом:
Код: Выделить всё
cn.Open «Driver=;Driver

cn.Execute «DELETE * FROM » & DbfName
cn.close

Записи помечаются к удалению, но остаются в таблице. Как из VB пропаковать *.dbf файл, чтобы окончательно удалить все записи?

Re: Удаление записей из DBF

Andrey Fedorov » 27.12.2005 (Вт) 9:24

Если оно действительно надо то с языками а-ля FoxPro/Clipper шла утилитка это делающая из командной строки.

Если же надо чисто из VB — проще пересоздать таблицу.

Re: Удаление записей из DBF

VVitafresh » 27.12.2005 (Вт) 16:08

Andrey Fedorov писал(а): Если оно действительно надо то с языками а-ля FoxPro/Clipper шла утилитка это делающая из командной строки.

Если же надо чисто из VB — проще пересоздать таблицу.

Как временное решение, так и сделал: вызываю через шелл написанную для этого на фоксе утилиту. Но как-то это не солидно (да и объемная она получилась, как для такой цели).

Насчет второго варианта прошу помощи. Пробую создавать примерно таким кодом:
Код: Выделить всё
Public Sub CreateDbf(DbfFolder As String, DbfName As String)
Dim cn As New ADODB.Connection
Dim sDbfFile As String, SQL As String

sDbfFile = DbfFolder & DbfName & «.dbf»
On Error Resume Next
GetAttr sDbfFile
If Err.Number = 0 Then Kill sDbfFile
On Error GoTo 0

SQL = «CREATE TABLE » & sDbfFile & » (F1 INT, F2 DATE, F3 TEXT)»

cn.Execute SQL
cn.Close
End Sub

Проблема в том, что некоторые числовые поля у меня должны быть строго типа decimal(17,2) (или NUMERIC(17,2), как в фоксе принято). Как можно задать такой тип при создании? Перепробовал несколько вариантов, все бьют ошибку.

VVitafresh » 29.12.2005 (Чт) 13:36

Ennor » 29.12.2005 (Чт) 16:24

Andrey Fedorov » 29.12.2005 (Чт) 17:00

Можно просто иметь шаблон таблички, который просто копируешь.

Или разобраться с форматом DBF и генерить заголовок самостоятельно.
В принципе можно брать его заготовку с существующего файла.

alibek » 29.12.2005 (Чт) 17:06

VVitafresh » 30.12.2005 (Пт) 11:00

2 Ennor
В том то и дело, что при задании числового поля не INT, а напр.:
Код: Выделить всё
CREATE TABLE TEST (F1 NUMERIC(17,2) NOT NULL)

Бьет ошибку: -2147217900 — [Microsoft][Драйвер ODBC dBase] Ошибка синтаксиса в инструкции CREATE TABLE.

2 Alibek & Andrey Fedorov
С форматом dbf разобраться конечно интересно, но это потребует времени. Пока сделал эталонную dbf’ку отдельным файлом и при необходимости заменяю рабочую.
Хотелось бы конечно восстанавливать по вашему совету из файла ресурсов, но к своему стыду с ресурсами я еще не работал
Если можно коротенький пример или ссылку, как извлечь данные из ресурса и сохранить в файл.

alibek » 30.12.2005 (Пт) 11:07

VVitafresh » 30.12.2005 (Пт) 11:26

Замечания

Если команда SET DELETED установлена в ON , записи, отмеченные для удаления игнорируются всеми командами, которые содержат scope. Для подробной информации, см. SET DELETED Command .

Чтобы определять количество модифицированных записей, используйте значение системной переменной _TALLY немедленно после выполнения команды SQL DELETE . Для подробной информации, см. _TALLY System Variable .

Совет:
При маркировке на удаление нескольких записей таблицы, открытой для разделяемого доступа, SQL DELETE использует блокировку записей, в отличие от команды DELETE . Это уменьшает конфликты записей в многопользовательских ситуациях, но может уменьшить скорость выполнения. Для максимальной скорости выполнения, откройте таблицу для монопольного использования или применяйте функцию FLOCK( ) для блокировки таблицы. Для подробной информации, см. DELETE Command и FLOCK( ) Function .

Пример 1

Описание

Следующий пример использует команду OPEN DATABASE , чтобы открыть тестовую базу данных Visual FoxPro TestData.dbc. Команда USE открывает таблицу «Клиенты» в TestData.dbc. Инструкция SQL DELETE помечает те записи на удаление, в которых поле Country содержит «USA». Команда CLEAR очищает главное окно Visual FoxPro. Команда LIST выводит все записи, отмеченные для удаления. После применения команды LIST , если будет вызвана команда PACK , отмеченные записи будут удалены.

Команда RECALL ALL снимает выделение всех записей, помеченных на удаление. Команда COUNT проверяет количество записей, помеченных на удаление, подсчитывая их. WAIT WINDOW выводит то количество записей, которые были помечены на удаление.

Илон Маск рекомендует:  details в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL