修改ORACLE7数据库maxdatafiles参数的方法
摘自:软件世界
2000/04/13
在安装ORACLE7时,一般对maxdatafiles(数据文件的最大个数)参数值不加修改或未意识到对其修改,而使用其默认值(往往比需要值要小)。但随着数据量的增多,需要不断地往表空间内增加数据文件,但是maxd atafiles的值限定了数据文件的最大个数,数据文件个数增加到最大值后,若再继续追加,就会导致"数据文件个数超过了最大值"的错误,以至后边的数据无法存入。
数据文件的最大个数因操作系统的不同而不同,但是,现在运行着的ORACLE7数据库中,数据文件的最大个数可以达到1000个以上,即maxdatafiles的参数值可设为1000或更大,远远大于其安装时的默认值(本系统安装时的默认值为30),如果遇到了"数据文件个数超过了最大值"的问题时,可通过修改maxdatafiles参数来解决,下面就介绍一下具体的修改方法:
1.实验环境
ALPHA8200服务器,操作系统Digial UNIX V3.2C,Oracle7.2数据库。
2.准备工作
启动ORACLE数据库,进行下列操作:
$sqldba mode=line(回车)
SQLDBA>connect internal(回车)
SQLDBA>alter database backup controlfile to trace;( 回车)
SQLDBA>show parameter user_dump_dest(回车)
可以看到trace文件"ora_3044.trc"在/volora/oracle/rdbms/log目录下。
将trace文件/volora/oracle/rdbms/log/ora_3044.trc拷贝成 df ileadd.sql。
用vi编辑dfileadd.sql文件,修改maxdatafiles参数(由原来的30改为300)。
Dfileadd.sql文件如下:
Dump file/volora/oracle/rdbms/log/ora_3044.trc
Oracle7 Server Release7.2.2.3.0 with the64-bit opti on- Production Release
With the distributed and parallel query options
PL/SQL Release2.2.2.3.0- Production
ORACLE_HOME=/volora/oracle
ORACLE_SID= ora72
Oracle process number:8 Unix process id:3044
System name: OSF1
Node name: slserver.sl.cnpc.co.cn
Release: V3.2
Version:148
Machine: alpha
Wed Apr2315:54:281997
Wed Apr2315:54:281997
*** SESSION ID:(9.1455)1997.04.23.15.54.28.359
# The following commands will create a new control file and use it
# to open the database.
# No data other than log history will be lost. Addi tional logs may
# be required for media recovery of offline data fi les. Use this
# only if the current version of all online logs ar e available.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE"ORA72" NORESETLOG S NOARCHIVELOG
MAXLOGFILES32
MAXLOGMEMBERS2
MAXDATAFILES300
MAXINSTANCES8
MAXLOGHISTORY800
LOGFILE
GROUP1'/volora/oracle/dbs/log1ora72.dbf' SIZE500K,
GROUP2'/volora/oracle/dbs/log2ora72.dbf' SIZE500K,
GROUP3'/volora/oracle/dbs/log3ora72.dbf' SIZE500K
DATAFILE
'/volora/oracle/dbs/systora72.dbf',
'/volora/oracle/dbs/rbsora72.dbf',
'/volora/oracle/dbs/tempora72.dbf',
'/volora/oracle/dbs/toolora72.dbf',
'/volora/oracle/dbs/usrora72.dbf',
'/volora/oracle/dbs/jhc.dbf',
'/volora/oracle/dbs/useradd.dbf'
;
# Recovery is required if any of the datafiles are restored backups,
# or if the last shutdown was not normal or immedia te.
RECOVER DATABASE
# Database can now be opened normally.
ALTER DATABASE OPEN;
将以上dfileadd.sql文件中横线上没用的斜体部分行删掉,存盘。
最后关闭数据库,并做好数据库的备份,包括数据和控制文件的备份,起码要用export将数据全部卸出。有条件的话,尽量做全备份,预防在数据库重建失败后瘫痪,因为下一步工作牵扯到对数据库的破坏和重新生成工作。
3.修改maxdatafiles参数的过程
3.1删除/volora/oracle/dbs目录下面所有的控制文件(共3个):
$rm*.ctl(回车)
3.2重新生成数据库(生成新的控制文件、数据文件等)
$sqldba mode=line(回车)
SQLDBA>connect internal(回车)
运行dfileadd.sql:
SQLDBA>@dfileadd.sql(回车)
ORACLE instance started.
Statement processed.
Media recovery complete.
Statement processed.
SQLDBA>alter database open noresetlogs;(回车)
至此,数据库的刷新工作已完成,可以投入正常运行了,目前运行着的ORACLE7数据库,数据文件最多可建立到300个。
在Windows 95下有一个任务栏可随时用鼠标单击任务栏上的应用程序图标切换到相应的程序,在Wind ows 3.X下要切换应用程序使用的方法有两种,一种是用ALT+TAB切换,另一种是用CTRL+ESC(或在桌面的空白处双击鼠标)打开任务列表从中选择切换,笔者在使用中总感到不如在Windows 95下那样方便。本文提供一个用VB 3.0专业版在Windows 3.2中文版下编写的程序,可实现将任务列表一直显示在屏幕上,随时可用鼠标双击任务列表中的程序名字切换,类似与Windows 95下的任务栏,使用很方便。
实现方法:在窗体中加入一列表框,将检测到的所有已打开的应用程序加入其中,用户就可以双击应用程序名字来切换了。这里还有一个将其常居顶端的问题,这方面的实现方法在许多报刊杂志上都可以看到,本文不再叙述,本文只给出其余功能的实现程序。
本程序在开始运行时检测已运行的应用程序并将它们加入到任务列表框中,当此后再有新的应用程序打开时,需要将其添加到列表框中,所以设计了一个刷新按钮,如果有新的应用程序打开,可点一下它。 另外类似与Windows 本身的任务列表功能,加入了一个切换按钮,当用户在任务列表中单击选择任务后,单击切换按钮也可切换,此外还有一个退出按钮用来关闭任务列表。
程序如下:
在窗体中加入如下对象并设置属性:
按钮1 Caption="刷新" name=cmdrefresh
按钮2 Caption="切换" name=cmdswitch
按钮3 Caption="退出" name=cmdexit
列表框list name=lstApp
将窗体形状拉成长条状,安排好对象位置,以便减少屏幕占用空间,将其边框属性改为固定边框,不允许改变大小。
在总体声明部分写如下代码:
'声明用到的API函数和常量
Option Explicit
Declare Function ShowWindow Lib"User"(ByVal hWnd As Integer, ByVal flgs As Integer) As Integer
Declare Function GetWindow Lib"User"(ByVal hWnd As Integer, ByVal wCmd As Integer) As Integer
Declare Function GetWindowWord Lib"User"(ByVal hWnd As Integer, ByVal wIndx As Integer) As Integer
Declare Function GetWindowLong Lib"User"(ByVal hWnd As Integer, ByVal wIndx As Integer) As Long
Declare Function GetWindowText Lib"User"(ByVal hWnd As Integer, ByVal lpSting As String, ByVal nMaxCount As Integer) As Integer
Declare Function GetWindowTextLength Lib"User"(ByVa l hWnd As Integer) As Integer
Declare Function SetWindowPos Lib"User"(ByVal hWnd As Integer, ByVal insaft As Integer, ByVal x%, ByVal y% , ByVal cx%, ByVal cy%, ByVal flgs As Integer) As Integ er
'注:上面的API函数要写在一行中
Const WS_MINIMIZE=&H20000000
Const HWND_TOP=0
Const SWP_NOSIZE=&H1
Const SWP_NOMOVE=&H2
Const SWP_SHOWWINDOW=&H40
Const GW_HWNDFIRST=0
Const GW_HWNDNEXT=2
Const GWL_STYLE=(-16)
Const SW_RESTORE=9
Const WS_VISIBLE=&H10000000
Const WS_BORDER=&H800000
Const WS_CLIPSIBLINGS=&H4000000
Const WS_THICKFRAME=&H40000
Const WS_GROUP=&H20000
Const WS_TABSTOP=&H10000
Dim IsTask As Long
'寻找已打开的应用程序函数
Sub FindAllApps()
Dim hwCurr As Long
Dim intLen As Long
Dim strTitle As String
lstApp.Clear
hwCurr= GetWindow(Me.hWnd, GW_HWNDFIRST)
Do While hwCurr
If hwCurr<> Me.hWnd And TaskWindow(hwCurr) Then
intLen= GetWindowTextLength(hwCurr)+1
strTitle= Space$(intLen)
intLen= GetWindowText(hwCurr, strTitle, intLen)
If intLen>0 Then
lstApp.AddItem strTitle
lstApp.ItemData(lstApp.NewIndex)= hwCurr
End If
End If
hwCurr= GetWindow(hwCurr, GW_HWNDNEXT)
Loop
End Sub
Function TaskWindow(hwCurr As Long) As Long
Dim lngStyle As Long
lngStyle= GetWindowLong(hwCurr, GWL_STYLE)
If(lngStyle And IsTask)= IsTask Then TaskWindow= Tr ue
End Function
双击"退出"按钮,写如下代码:
Sub Cmdexit_Click()
Unload Me
End Sub
双击"刷新"按钮,写如下代码:
Sub Cmdrefresh_Click()
FindAllApps'刷新任务列表
End Sub
双击"切换"按钮,写如下代码:
Sub Cmdswitch_Click()
Dim hWnd As Long
Dim x As Long
Dim lngWW As Long
If lstApp.ListIndex<0 Then Beep: Exit Sub
hWnd= lstApp.ItemData(lstApp.ListIndex)
lngWW= GetWindowLong(hWnd, GWL_STYLE)
If lngWW And WS_MINIMIZE Then
x= ShowWindow(hWnd, SW_RESTORE)
End If
x= SetWindowPos(hWnd, HWND_TOP,0,0,0,0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)
End Sub
双击窗体,写如下代码:
Sub Form_Load()
IsTask= WS_VISIBLE Or WS_BORDER
FindAllApps
End Sub
窗体更新时刷新任务列表:
Sub Form_Paint()
FindAllApps
End Sub双击列表框写如下代码:
Sub lstApp_DblClick()
Switch.Value= True
End Sub
软件世界