如何在Oracle10g中启动和关闭OEM

从Oracle10g开始,Oracle极大的增强了OEM工具,并通过服务器端进行EM工具全面展现。
在10g中,客户端可以不必安装任何Oracle客户端工具,仅凭浏览器就可以调用强大的EM工具。
在Server端,可以通过如下命令启动EM工具控制台:
emctl start dbconsole
以下是启动过程:
[oracle@danaly ~]$ emctl start dbconsole
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0  
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.
http://danaly.hurrray.com.cn:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control .......................... started.
------------------------------------------------------------------
Logs are generated in directory /opt/oracle/product/10.2.0/danaly.hurrray.com.cn_danaly/sysman/log

启动之后我们就可以通过在浏览器端输入以下url访问:
http://danaly.hurrray.com.cn:1158/em/
同样停止OEM可以输入如下命令:
emctl stop dbconsole

以下是停止过程:
[oracle@danaly ~]$ emctl stop dbconsole
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0  
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.
http://danaly.hurrray.com.cn:1158/em/console/aboutApplication
Stopping Oracle Enterprise Manager 10g Database Control ......  Stopped.

也可以直接键入emctl查看emctl支持的选项:
[oracle@danaly ~]$ emctl
TZ set to PRC
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0  
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.
Invalid arguments
Unknown command option
Usage::
  Oracle Enterprise Manager 10g Database Control commands:
      emctl start| stop| status| setpasswd dbconsole

阅读全文

使用SQLSERVER的扩展存储过程实现远程备份与恢复

最近我在为公司的框架程序(以数据应用为导向的应用体系)做数据管理模块,这个模块的需求比较简单:备份、恢复和清理日志。我公司的软件基本上以C/S为基本架构,所以数据管理模块中两个主要的功能'备份与恢复’都可能会在Client端操作,备份与恢复’的文件也都有可能存储在client端,因而这个数据管理模块就必须能够实现在远程备份与恢复数据库。
 文章的前提阐述完了,就该说说如何具体实现吧。其实都很简单,我想写个远程备份的测试实例
给大家看,就能够很清楚的描述吧!
 实例说明:
          环境:win2k sqlserver 2K 查询分析器
          SQLSERVER服务实例名称:mainserver
          需要备份的数据库名称: msdb
          本地机器名称(Client端):david
          本地用户:zf 密码:123
          本地域名:domain
          本地提供备份需求的文件夹:e: est
 第一步: 建立共享文件夹
    在程序代码中调用(或者CMD窗口)  net share test=e: est
    或者用NetShareAdd这个API
    简要说明:
           net share     : 是WINDOWS内部的网络命令。
                           作用:建立本地的共享资源,显示当前计算机的共享资源信息。
                           语法:参见 net share /?  
 第二步: 建立共享信用关系
    master..xp_cmdshell 'net use  david est 123 /user:domainzf'
    简要说明:
          1:xp_cmdshell :是SQLSERVER的扩展存储过程。
                           作用,以操作系统命令行解释器的方式执行给定的命令字符串,
                           并以文本行方式返回任何输出。
                           语法:参见SQLSERVER联机帮助
          2:net use      : 是WINDOWS内部的网络命令。
                           作用,将计算机与共享资源连接或断开,或者显示关于计算机
                           连接的信息。该命令还控制持久网络连接。
                           语法:参见 net use /?
 第三步:备份数据库
    backup database msdb to disk='david estmsdb.bak'
    这个不需要说明吧,语法参见SQLSERVER联机帮助
 第四步: 删除共享文件夹

阅读全文

如何获取SQL Server数据库里表的占用容量大小

其实只要使用系统内置的存储过程sp_spaceused就可以得到表的相关信息
如:sp_spaceused 'tablename'
以下是为了方便写的一个存储过程,目的是把当前的所有表的相关信息全部都保存在一个指定的表里面
CREATE PROCEDURE get_tableinfo AS

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tablespaceinfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
create table  tablespaceinfo                         --创建结果存储表
             (nameinfo varchar(50) ,  
              rowsinfo int , reserved varchar(20) ,  
              datainfo varchar(20)  ,  
              index_size varchar(20) ,  
              unused varchar(20) )


delete from tablespaceinfo --清空数据表

declare @tablename varchar(255)  --表名称

declare @cmdsql varchar(500)

DECLARE Info_cursor CURSOR FOR  
select o.name  
from dbo.sysobjects o where OBJECTPROPERTY(o.id, N'IsTable') = 1  
    and o.name not like N'#%%'  order by o.name

OPEN Info_cursor

FETCH NEXT FROM Info_cursor  
INTO @tablename  

WHILE @@FETCH_STATUS = 0
BEGIN

 if exists (select * from dbo.sysobjects where id = object_id(@tablename) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 execute sp_executesql  
        N'insert into tablespaceinfo  exec sp_spaceused @tbname',
         N'@tbname varchar(255)',
         @tbname = @tablename

 FETCH NEXT FROM Info_cursor  
 INTO @tablename  
END

CLOSE Info_cursor
DEALLOCATE Info_cursor
GO


执行存储过程
exec get_tableinfo
查询运行该存储过程后得到的结果
select *
from tablespaceinfo  
order by cast(left(ltrim(rtrim(reserved)) , len(ltrim(rtrim(reserved)))-2) as int) desc

阅读全文

从 MySQL 导入导出大量数据的程序实现方法

大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题: 

1 数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。

阅读全文

怎么使 Mysql 数据同步

先假设有主机 A 和 B ( Linux 系统),主机 A 的 IP 分别是 1.2.3.4 (当然,也可以是动态的),主机 B 的 IP 是 5.6.7.8 。两个主机都装上了 PHP+Mysql ,现在操作的是主机 A 上的资料,如果另外一个主机 B 想跟 A 的资料进行同步,应该怎么做呢? 

阅读全文

SQL Server里函数的两种用法(可以代替游标)

SQL Server里函数的两种用法(可以代替游标)
1. 因为update里不能用存储过程,然而要根据更新表的某些字段还要进行计算。我们常常采用游标的方法,这里用函数的方法实现。
 
函数部分:
CREATE FUNCTION [DBO].[FUN_GETTIME] (@TASKPHASEID INT)
RETURNS FLOAT AS
BEGIN
 DECLARE @TASKID INT,
         @HOUR FLOAT,
         @PERCENT FLOAT,
         @RETURN FLOAT
 IF @TASKPHASEID IS NULL
 BEGIN
   RETURN(0.0)
 END
SELECT @TASKID=TASKID,@PERCENT=ISNULL(WORKPERCENT,0)/100
FROM TABLETASKPHASE
WHERE ID=@TASKPHASEID
SELECT @HOUR=ISNULL(TASKTIME,0) FROM TABLETASK
WHERE ID=@TASKID
SET @RETURN=@HOUR*@PERCENT
RETURN (@RETURN)
END
调用函数的存储过程部分
CREATE PROCEDURE [DBO].[PROC_CALCCA]
@ROID INT
 AS
BEGIN
 DECLARE @CA FLOAT
 UPDATE TABLEFMECA
 SET
 Cvalue_M=    ISNULL(MODERATE,0)*ISNULL(FMERATE,0)*ISNULL(B.BASFAILURERATE,0)*[DBO].[FUN_GETTIME](C.ID)
FROM TABLEFMECA ,TABLERELATION B,TABLETASKPHASE C
WHERE ROID=@ROID AND TASKPHASEID=C.ID AND B.ID=@ROID
 SELECT @CA=SUM(ISNULL(Cvalue_M,0)) FROM TABLEFMECA WHERE ROID=@ROID
UPDATE TABLERELATION
 SET CRITICALITY=@CA
 WHERE ID=@ROID
END
GO
2. 我们要根据某表的某些记录,先计算后求和,因为无法存储中间值,平时我们也用游标的方法进行计算。但sqlserver2000里支持
SUM ( [ ALL | DISTINCT ] expression )
expression
是常量、列或函数,或者是算术、按位与字符串等运算符的任意组合。因此我们可以利用这一功能。
函数部分:
CREATE FUNCTION [DBO].[FUN_RATE] (@PARTID INT,@ENID INT,@SOURCEID INT, @QUALITYID INT,@COUNT INT)
RETURNS FLOAT AS
BEGIN
 DECLARE @QXS FLOAT, @G FLOAT, @RATE FLOAT

阅读全文

查询表主键外键信息的SQL

我的BSOOC里需要一个查询表主键外键信息的SQL,昨晚研究到凌晨1点,终于能实现这个目标:
Oracle:
select o.obj# as objectId, o.name AS tableName, oc.name AS constraintName,
decode(c.type#, 1, 'C', 2, 'P', 3, 'U',
4, 'R', 5, 'V', 6, 'O', 7,'C', '?') as constraintType,
col.name AS columnName

from sys.con$ oc, sys.con$ rc,
sys.obj$ ro,sys.obj$ o, sys.obj$ oi,
sys.cdef$ c,
sys.col$ col, sys.ccol$ cc, sys.attrcol$ ac
where oc.con# = c.con#
and c.obj# = o.obj#
and c.rcon# = rc.con#( )
and c.enabled = oi.obj#( )
and c.robj# = ro.obj#( )
and c.type# != 8
and c.type# != 12 /* don't include log groups */
and c.con# = cc.con#
and cc.obj# = col.obj#
and cc.intcol# = col.intcol#
and cc.obj# = o.obj#
and col.obj# = ac.obj#( )
and col.intcol# = ac.intcol#( )
and o.name = 'your table'

SQL Server:
SELECT sysobjects.id objectId,
OBJECT_NAME(sysobjects.parent_obj) tableName,
sysobjects.name constraintName,
sysobjects.xtype AS constraintType,
syscolumns.name AS columnName
FROM sysobjects INNER JOIN sysconstraints
ON sysobjects.xtype in('C', 'F', 'PK', 'UQ', 'D')
AND sysobjects.id = sysconstraints.constid
LEFT OUTER JOIN syscolumns ON sysconstraints.id = syscolumns.id
WHERE OBJECT_NAME(sysobjects.parent_obj)='your table'

其它数据库还没时间去实现.

阅读全文

MySQL用户管理

 MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么。MySQL 3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而REVOKE语句删除权限。两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一种方法。CREATE和REVOKE语句影响4个表:授权表
 
内容
 
user 能连接服务器的用户以及他们拥有的任何全局权限
 
db 数据库级权限
 
tables_priv 表级权限
 
columns_priv 列级权限
 
还有第5个授权表(host),但它不受GRANT和REVOKE的影响。
 
当你对一个用户发出一条GRANT语句时,在user表中为该用户创建一条记录。如果语句指定任何全局权限(管理权限或适用于所有数据库的权限),这些也记录在user表中。如果你指定数据库、表和列级权限,他们被分别记录在db、tables_priv和columns_priv表中。
 
用GRANT和REVOKE比直接修改授权表更容易些,然而,建议你阅读一下《MySQL安全性指南》。这些表异常重要,而且作为一名管理员,你应该理解它们如何超越GRANT和REVOKE语句的功能水平。
 
在下面的章节中,我们将介绍如何设置MySQL用户账号并授权。我们也涉及如何撤权和从授权表中删除用户。
 
你可能也想考虑使用mysqlaccess和mysql_setpermission脚本,它是MySQL分发的一部分,它们是Perl脚本,提供GRANT语句的另一种选择设置用户账号。mysql_setpermission需要安装DBI支持。
 
1 创建用户并授权
 
GRANT语句的语法看上去像这样:
 
GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 
 
要使用该语句,你需要填写下列部分:
 
privileges
 
授予用户的权限,下表列出可用于GRANT语句的权限指定符:
 
权限指定符
 
权限允许的操作
 
ALTER 修改表和索引
 
CREATE 创建数据库和表
 
DELETE 删除表中已有的记录
 
DROP 抛弃(删除)数据库和表
 
INDEX 创建或抛弃索引
 
INSERT 向表中插入新行

阅读全文

关于Sql server数据库日志满的快速解决办法

先提供一种复杂的方法压缩日志及数据库文件如下:
1.清空日志
  DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
  BACKUP LOG 数据库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
  也可以用SQL语句来完成
  --收缩数据库
  DBCC SHRINKDATABASE(客户资料)
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
  DBCC SHRINKFILE(1)
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
  a.分离数据库:
  企业管理器--服务器--数据库--右键--分离数据库
  b.在我的电脑中删除LOG文件
  c.附加数据库:
  企业管理器--服务器--数据库--右键--附加数据库
  此法将生成新的LOG,大小只有500多K
  或用代码:
  下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
  a.分离
  E X E C sp_detach_db @dbname = 'pubs'
  b.删除日志文件
  c.再附加
  E X E C sp_attach_single_file_db @dbname = 'pubs',
  @physname = 'c:Program FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
5.为了以后能自动收缩,做如下设置:
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
  --SQL语句设置方式:
  E X E C sp_dboption '数据库名', 'autoshrink', 'TRUE'
6.如果想以后不让它日志增长得太大
  企业管理器--服务器--右键数据库--属性--事务日志
  --将文件增长限制为xM(x是你允许的最大数据文件大小)
  --SQL语句的设置方式:
  alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
特别注意:
  请按步骤进行,未进行前面的步骤,请不要做后面的步骤
  否则可能损坏你的数据库.
  一般不建议做第4,6两步
  第4步不安全,有可能损坏数据库或丢失数据
  第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
另外提供一种更简单的方法,本人屡试不爽,建议大家使用。
更简单的方法:
1。右建数据库属性窗口--故障还原模型--设为简单
2。右建数据库所有任务--收缩数据库
3。右建数据库属性窗口--故障还原模型--设为大容量日志记录

阅读全文

用 PHP 和 MySQL 保存和输出图片

在我们设计和制作网站的过程中,有时把图片保存到数据库中要比存成文件的形式更加方便。PHP和MySQL这对黄金组合可以很容易的实现上述功能。在本文中,我们将会向读者介绍如何把图片保存到MySQL数据库中以及如何将数据库中的图片显示出来。
设置数据库
  我们通常在数据库中所使用的文本或整数类型的字段和需要用来保存图片的字段的不同之处就在于两者所需要保存的数据量不同。MySQL数据库使用专门的字段来保存大容量的数据,数据类型为BLOB。
  MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可变数量的数据。BLOB具有四种类型,分别是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,区别在于各自所能够保存的最大数据长度不同。
  在介绍了所需要使用的数据类型之后,我们可以使用以下语句创建保存图象的数据表。
  CREATE TABLE Images ( PicNum int NOT NULL AUTO_INCREMENT PRIMARY KEY, Image BLOB );
编写上传脚本
  关于如何实现文件的上传,我们在这里就不再介绍了,感兴趣的读者可以参见“网页陶吧”内的相关文章。现在,我们主要来看一下如何接收上传文件并将其存入到MySQL数据库中。具体的脚本代码如下,其中我们假定文件上传域的名称为Picture。
<? If($Picture !=
摘自:http://it.dayoo.com/news/detail.asp?news_id=2085

阅读全文

为数据库建立索引(二)

接着,来个稍微复杂一点的,如果有个ORDER BY字句呢?不管你信不信,大多数的数据库在使用order by的时候,都将会从索引中受益。
   SELECT * FROM mytable
    WHERE category_id=1 AND user_id=2
     ORDER BY adddate DESC;
有点迷惑了吧?很简单,就象为where字句中的字段建立一个索引一样,也为ORDER BY的字句中的字段建立一个索引:
   CREATE INDEX mytable_categoryid_userid_adddate
     ON mytable (category_id,user_id,adddate);
   注意: "mytable_categoryid_userid_adddate" 将会被截短为
   "mytable_categoryid_userid_addda"
   CREATE
   EXPLAIN SELECT * FROM mytable
    WHERE category_id=1 AND user_id=2
     ORDER BY adddate DESC;
   NOTICE: QUERY PLAN:
   Sort (cost=2.03..2.03 rows=1 width=16)
    -> Index Scan using mytable_categoryid_userid_addda
       on mytable (cost=0.00..2.02 rows=1 width=16)
   EXPLAIN
  看看EXPLAIN的输出,好象有点恐怖啊,数据库多做了一个我们没有要求的排序,这下知道性能如何受损了吧,看来我们对于数据库的自身运作是有点过于乐观了,那么,给数据库多一点提示吧。
  为了跳过排序这一步,我们并恍枰?渌?硗獾乃饕??灰??檠?锞渖晕⒏囊幌隆U饫镉玫氖?ostgres,我们将给该数据库一个额外的提示--在ORDER BY语句中,加入where语句中的字段。这只是一个技术上的处理,并不是必须的,因为实际上在另外两个字段上,并不会有任何的排序操作,不过如果加入,postgres将会知道哪些是它应该做的。
   EXPLAIN SELECT * FROM mytable
    WHERE category_id=1 AND user_id=2
     ORDER BY category_id DESC,user_id DESC,adddate DESC;
   NOTICE: QUERY PLAN:
   Index Scan Backward using
    mytable_categoryid_userid_addda on mytable
     (cost=0.00..2.02 rows=1 width=16)
   EXPLAIN
现在使用我们料想的索引了,而且它还挺聪明,知道可以从索引后面开始读,从而避免了任何的排序。
以上说得细了一点,不过如果你的数据库非常巨大,并且每日的页面请求达上百万算,我想你会获益良多的。不过,如果你要做更为复杂的查询呢,例如将多张表结合起来查询,特别是where限制字句中的字段是来自不止一个表格时,应该怎样处理呢?我通常都尽量避免这种做法,因为这样数据库要将各个表中的东西都结合起来,然后再排除那些不合适的行,搞不好开销会很大。

阅读全文