mysql create database 指定path_使用CREATE DATABASE语句创建数据库

本文参考了《Administrator's Guide 》第二章中使用create database创建数据库的方式。一般而言,我们最先接触到的是使用dbca创建数据库,与之相比,使用create database 显得较为复杂。

-----------------------------------------------------------------------------------------

使用create database命令创建数据库需要经过如下步骤:

步骤1: 指定实例标识符

export ORACLE_SID=mynewdb

步骤2: 设定相关的环境变量

ORACLE_HOME和ORACLE_SID必须指定,PATH变量可选

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

export PATH=$PATH:$ORACLE_HOME/bin

数据库管理员的认证方式有密码文件认证和操作系统认证。

密码文件认证:在创建密码文件时会要求输入密码。

操作系统认证:将用户加入到dba组中。

步骤4: 创建静态参数文件

可以从其他数据库中拷贝静态参数文件,也可以通过修改初始化参数的样本来创建参数文件。

DB_NAME、CONTROL_FILES、MEMORY_TARGET这三个参数值必须要指定。

静态参数文件命名为initSID.ora。

[oracle@mycentos dbs]$ cp init.ora initmynewdb.ora

注:因为只是测试,因此并未对样本参数文件做过多的修改。要注意的是,要建好参数文件中对应的目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DB类<?php header('Content-Type:text/html; charset=utf-8'); basename($_SERVER['PHP_SELF'])=='mysql.inc.php'&&header; ('Location:http://'.$_SERVER['HTTP_HOST']); //禁止直接访问本页 /** ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ 【文件名】: mysql.inc.php 【作 用】: mysql数据库操作类 【作 者】: Riyan 【版 本】: version 2.0 【修改日期】: 2010/02/11 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ **/ class mysql{ private $host; // 数据库主机 private $user; // 数据库用户名 private $pass; // 数据库密码 private $data; // 数据库名 private $conn; // 数据库连接标识 private $sql; // sql语句 private $code; // 数据库编码,GBK,UTF8,GB2312 private $result; // 执行query命令的结果数据集 private $errLog=true; // 是否开启错误日志,默认开启 private $showErr=true; // 显示所有错误,具有安全隐患,默认开启 private $pageNo=1; // 当前页 private $pageAll=1; // 总页数 private $rsAll=0; // 总记录 private $pageSize=10; // 每页显示记录条数 /****************************************************************** -- 函数名:__construct($host,$user,$pass,$data,$code,$conn) -- 作 用:构造函数 -- 参 数:$host 数据库主机地址(必填) $user 数据库用户名(必填) $pass 数据库密码(必填) $data 数据库名(必填) $conn 数据库连接标识(必填) $code 数据库编码(必填) -- 返回值:无 -- 实 例:无 *******************************************************************/ public function __construct($host,$user,$pass,$data,$code='utf8', $conn='conn'){ $this->host=$host; $this->user=$user; $this->pass=$pass; $this->data=$data; $this->conn=$conn; $this->code=$code; $this->connect(); } public function __get($name){return $this->$name;} public function __set($name,$value){$this->$name=$value;} // 数据库连接 private function connect(){ if ($this->conn=='pconn') $this->conn=mysql_pconnect($this- >host,$this->user,$this->pass); // 永久链接 else $this->conn=mysql_connect($this->host,$this->user,$this- >pass); // 临时链接 if (!$this->conn) $this->show_error('无法连接服务器'); $this->select_db($this->data); $this->query('SET NAMES '.$this->code); $this->query("SET CHARACTER_SET_CLIENT='{$this->code}'"); $this->query("SET CHARACTER_SET_RESULTS='{$this->code}'"); } // 数据库选择 public function select_db($data){ $result=mysql_select_db($data,$this->conn); if (!$result) $this->show_error('无法连接数据库'.$data); return $result; } /****************************************************************** -- 函数名:get_info($num) -- 作 用:取得 MySQL 服务器信息 -- 参 数:$num 信息值(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function get_info($num){ switch ($num){ case 1: return mysql_get_server_info(); // 取得 MySQL 服务器信息 break; case 2: return mysql_get_host_info(); // 取得 MySQL 主机信息 break; case 3: return mysql_get_proto_info(); // 取得 MySQL 协议信息 break; default: return mysql_get_client_info(); // 取得 MySQL 客户端信息 } } /****************************************************************** -- 函数名:query($sql) -- 作 用:数据库执行语句,可执行查询添加修改删除等任何sql语句 -- 参 数:$sql sql语句(必填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function query($sql){ if (empty($sql)) $this->show_error('SQL语句为空'); $this->sql=preg_replace('/ {2,}/',' ',trim($sql)); $this->result=mysql_query($this->sql,$this->conn); if (!$this->result) $this->show_error('SQL语句有误',true); return $this->result; } /****************************************************************** -- 函数名:create_db($data) -- 作 用:创建添加新的数据库 -- 参 数:$data 数据库名称(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function create_database($data=''){$this->query("CREATE DATABASE {$data}");} // 查询服务器所有数据库 public function show_database(){ $this->query('SHOW DATABASES'); $db=array(); while ($row=$this->fetch_array()) $db[]=$row['Database']; return $db; } // 查询数据库下所有的表 public function show_tables($data=''){ if (!empty($data)) $db=' FROM '.$data; $this->query('SHOW TABLES'.$data); $tables=array(); while ($row=$this->fetch_row()) $tables[]=$row[0]; return $tables; } /****************************************************************** -- 函数名:copy_tables($tb1,$tb2,$where) -- 作 用:复制表 -- 参 数:$tb1 新表名(必填) $tb2 待复制表的表名(必填) $Condition 复制条件(选填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function copy_tables($tb1,$tb2,$Condition=''){$this->query ("SELECT * INTO `{$tb1}` FROM `{$tb2}` {$Condition}");} /****************************************************************** -- 函数名:Get($Table,$Fileds,$Condition,$Rows) -- 作 用:查询数据 -- 参 数:$Table 表名(必填) $Fileds 字段名,默认为所有(选填) $Condition 查询条件(选填) $Rows 待查询记录条数,为0表示不限制(选填) -- 返回值:布尔 -- 实 例:$DB->Get('mydb','user,password','order by id desc',10) *******************************************************************/ public function Get($Table,$Fileds='*',$Condition='',$Rows=0){ if (!$Fileds) $Fileds='*'; if ($Rows>0) $Condition.=" LIMIT 0,{$Rows}"; $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}"; return $this->query($sql); } // 只查询一条记录 public function GetRs($Table,$Fileds='*',$Condition=''){ if (!$Fileds) $Fileds='*'; $this->query("SELECT {$Fileds} FROM `{$Table}` {$Condition} LIMIT 0,1"); return $this->fetch_array(); } /****************************************************************** -- 函数名:Add($Table,$Data) -- 作 用:添加数据 -- 参 数:$Table 表名(必填) $Data 待添加数据,可以为数组(必填) -- 返回值:布尔 -- 实 例:$DB->Add('mydb',array ('user'=>'admin','password'=>'123456','age'=>'18') 数组类型 $DB->Add('mydb','user=admin,password=123456,age=18') 字符 串类型 *******************************************************************/ public function Add($Table,$Data){ if (!is_array($Data)){ $arr=explode(',',$Data); $Data=array(); foreach ($arr as $val){ list($key,$val)=explode('=',$val); if (!$val) $val=''; $Data[$key]=$val; } } $Fileds='`'.implode('`,`',array_keys($Data)).'`'; $Value="'".implode("','",array_values($Data))."'"; return $this->query("INSERT INTO `{$Table}` ({$Fileds}) VALUES ({$Value})"); } /****************************************************************** -- 函数名:Set($Table,$Data,$Condition,$unQuot) -- 作 用:更改数据 -- 参 数:$Table 表名(必填) $Data 待更改数据,可以为数组(必填) $Condition 更改条件(选填) $unQuot 不需要加引号的字段,用于字段的加减运算等情况,多个 字段用,分隔或者写入一个数组(选填) -- 返回值:布尔 -- 实 例:$DB->Set('mydb',array ('user'=>'admin','password'=>'123456','WHERE id=1') 数组类型 $DB->Set('mydb',"user='admin',password='123456'",'WHERE id=1') 字符串类型 *******************************************************************/ public function Set($Table,$Data,$Condition='',$unQuot=''){ if (is_array($Data)){ if (!is_array($unQuot)) $unQuot=explode(',',$unQuot); foreach ($Data as $key=>$val){ $arr[]=$key.'='.(in_array($key,$unQuot)?$val:"'$val'"); } $Value=implode(',',$arr); }else $Value=$Data; return $this->query("UPDATE `{$Table}` SET {$Value} {$Condition}"); } /****************************************************************** -- 函数名:Del($Table,$Condition) -- 作 用:删除数据 -- 参 数:$Table 表名(必填) $Condition 删除条件(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function Del($Table,$Condition=''){return $this->query ("DELETE FROM `{$Table}`".($Condition?" WHERE {$Condition}":''));} // 取得结果数据 public function result($result=''){ if (empty($result)) $result=$this->result; if ($result==null) $this->show_error('未获取到查询结果',true); return mysql_result($result); } /****************************************************************** -- 函数名:fetch_array($Table,$Condition) -- 作 用:根据从结果集取得的行生成关联数组 -- 参 数:$result 结果集(选填) $type 数组类型,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function fetch_array($result='',$type=MYSQL_BOTH){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_array($result,$type); } // 获取关联数组,使用$row['字段名'] public function fetch_assoc($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_assoc($result); } // 获取数字索引数组,使用$row[0],$row[1],$row[2] public function fetch_row($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_row($result); } // 获取对象数组,使用$row->content public function fetch_obj($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_object($result); } // 取得上一步 INSERT 操作产生的 ID public function insert_id(){return mysql_insert_id();} // 指向确定的一条数据记录 public function data_seek($id){ if ($id>0) $id=$id-1; if (!mysql_data_seek($this->result,$id)) $this->show_error('指定 的数据为空'); return $this->result; } /****************************************************************** 函数名:num_fields($result) 作 用:查询字段数量 参 数:$Table 数据库表名(必填) 返回值:字符串 实 例:$DB->num_fields("mydb") *******************************************************************/ public function num_fields($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_num_fields($result); } // 根据select查询结果计算结果集条数 public function num_rows($result=''){ if (empty($result)) $result=$this->result; $rows=mysql_num_rows($result); if ($result==null){ $rows=0; $this->show_error('未获取到查询结果',true); } return $rows>0?$rows:0; } // 根据insert,update,delete执行结果取得影响行数 public function affected_rows(){return mysql_affected_rows();} // 获取地址栏参数 public function getQuery($unset=''){ //$unset表示不需要获取的参数, 多个参数请用,分隔(例如:getQuery('page,sort')) if (!empty($unset)){ $arr=explode(',',$unset); foreach ($arr as $val) unset($_GET[$val]); } foreach ($_GET as $key=>$val) $list[]=$key.'='.urlencode($val); return is_array($list)?implode('&',$list):''; } /****************************************************************** 函数名:getPage($Table,$Fileds,$Condition,$pageSize) 作 用:获取分页信息 参 数:$Table 表名(必填) $Fileds 字段名,默认所有字段(选填) $Condition 查询条件(选填) $pageSize 每页显示记录条数,默认10条(选填) 返回值:字符串 实 例:无 *******************************************************************/ public function getPage($Table,$Fileds='*',$Condition='', $pageSize=10){ if (intval($pageSize)>0){$this->pageSize=intval($pageSize);} if (isset($_GET['page']) && intval($_GET['page'])){$this- >pageNo=intval($_GET['page']);} if (empty($Fileds)){$Fileds='*';} $sql="SELECT * FROM `{$Table}` {$Condition}"; $this->query($sql); $this->rsAll=$this->num_rows(); if ($this->rsAll>0){ $this->pageAll=ceil($this->rsAll/$this->pageSize); if ($this->pageNo<1){$this->pageNo=1;} if ($this->pageNo>$this->pageAll){$this->pageNo=$this- >pageAll;} $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}".$this- >limit(true); $this->query($sql); } return $this->rsAll; } // 构造分页limit语句,和getPage()函数搭配使用 public function limit($str=false){ $n=($this->pageNo-1)*$this->pageSize; return $str?' LIMIT '.$n.','.$this->pageSize:$n; } // 显示分页,必须和getPage()函数搭配使用 public function showPage($number=true){ $pageBar=''; if ($this->pageAll>1){ $pageBar.='<ul class="page">'.chr(10); $url=$this->getQuery('page'); $url=empty($url)?'?page=':'?'.$url.'&page;='; if ($this->pageNo>1){ $pageBar.='<li><a href="'.$url.'1">首页</a></li>'.chr (10); $pageBar.='<li><a >pageNo-1).'">上页 </a></li>'.chr(10); }else{ $pageBar.='<li class="stop"><span>首页</span></li>'.chr (10); $pageBar.='<li class="stop"><span>上页</span></li>'.chr (10); } if ($number){ $arr=array(); if ($this->pageAll<6){ for ($i=0;$i<$this->pageAll;$i++) $arr[]=$i+1; }else{ if ($this->pageNo<3) $arr=array(1,2,3,4,5); elseif ($this->pageNo<=$this->pageAll&&$this- >pageNo>($this->pageAll-3)) for ($i=1;$i<6;$i++) $arr[]=$this->pageAll-5+$i; else for ($i=1;$i<6;$i++) $arr[]=$this->pageNo-3+$i; } foreach ($arr as $val){ if ($val==$this->pageNo) $pageBar.='<li class="curr"><span>'.$val.'</span></li>'.chr(10); else $pageBar.='<li><a href="'.$url.$val.'">'. $val.'</a></li>'.chr(10); } } if ($this->pageNo<$this->pageAll){ $pageBar.='<li><a >pageNo+1).'">下页 </a>'.chr(10); $pageBar.='<li><a >pageAll.'">尾页 </a></li>'.chr(10); }else{ $pageBar.='<li class="stop"><span>下页</span></li>'.chr (10); $pageBar.='<li class="stop"><span>尾页</span></li>'.chr (10); } $pageBar.='<li class="stop"><span>'; $pageBar.="页次:{$this->pageNo}/{$this->pageAll} {$this- >pageSize}条/页 总记录:{$this->rsAll} 转到:"; $pageBar.="<input id=\"page\" value=\"{$this->pageNo}\" type=\"text\" onblur=\"goPage('{$url}',{$this->pageAll});\" />"; $pageBar.='</span></li></ul>'.chr(10); } echo $pageBar; } // 获得客户端真实的IP地址 public function getip(){ if ($_SERVER['HTTP_X_FORWARDED_FOR']) return $_SERVER ['HTTP_X_FORWARDED_FOR']; elseif ($_SERVER['HTTP_CLIENT_IP']) return $_SERVER ['HTTP_CLIENT_IP']; elseif ($_SERVER['REMOTE_ADDR']) return $_SERVER['REMOTE_ADDR']; elseif (getenv('HTTP_X_FORWARDED_FOR')) return getenv ('HTTP_X_FORWARDED_FOR'); elseif (getenv('HTTP_CLIENT_IP')) return getenv ('HTTP_CLIENT_IP'); elseif (getenv('REMOTE_ADDR')) return getenv('REMOTE_ADDR'); else return ''; } /****************************************************************** -- 函数名:show_error($message,$sql) -- 作 用:输出显示错误信息 -- 参 数:$msg 错误信息(必填) $sql 显示错误的SQL语句,在SQL语句错误时使用(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function show_error($msg='',$sql=false){ $err='['.mysql_errno().']'.mysql_error(); if ($sql) $sql='SQL语句:'.$this->sql; if ($this->errLog){ $dirs='error/'; //设置错误日志保存目录 $fileName=date('Y-m-d').'.log'; $filePath=$dirs.$fileName; if (!is_dir($dirs)){ $dirs=explode('/',$dirs); $temp=''; foreach($dirs as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ mkdir($temp,0777) or die('__无法建立目录'. $temp.',自动取消记录错误信息'); } } $filePath=$temp.$fileName; } $text="错误事件:".$msg."\r\n错误原因:".$err."\r\n".($sql? $sql."\r\n":'')."客户端IP:".$this->getip()."\r\n记录时间:".date('Y-m-d H:i:s')."\r\n\r\n"; $log='错误日志:__'.(error_log($text,3,$filePath)?'此错误信 息已被自动记录到日志'.$fileName:'写入错误信息到日志失败'); } if ($this->showErr){ echo ' <fieldset class="errlog"> <legend>错误信息提示</legend> <label class="tip">错误事件:'.$err.'</label> <label class="msg">错误原因:'.$msg.'</label> <label class="sql">'.$sql.'</label> <label class="log">'.$log.'</label> </fieldset>'; exit(); } } /****************************************************************** -- 函数名:drop($table) -- 作 用:删除表(请慎用,无法恢复) -- 参 数:$table 要删除的表名,默认为所有(选填) -- 返回值:无 -- 实 例:$DB->drop('mydb') *******************************************************************/ public function drop($table){ if ($table){ $this->query("DROP TABLE IF EXISTS `{$table}`"); }else{ $rst=$this->query('SHOW TABLES'); while ($row=$this->fetch_array()){ $this->query("DROP TABLE IF EXISTS `{$row[0]}`"); } } } /****************************************************************** -- 函数名:makeSql($table) -- 作 用:从数据表读取信息并生成SQL语句 -- 参 数:$table 待读取的表名(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function makeSql($table){ $result=$this->query("SHOW CREATE TABLE `{$table}`"); $row=$this->fetch_row($result); $sqlStr=''; if ($row){ $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Table structure for `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="DROP TABLE IF EXISTS `{$table}`;\r\n{$row[1]};\r \n"; $this->Get($table); $fields=$this->num_fields(); if ($this->num_rows()>0){ $sqlStr.="\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Records of `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; while ($row=$this->fetch_row()){ $comma=''; $sqlStr.="INSERT INTO `{$table}` VALUES ("; for($i=0;$i<$fields;$i++){ $sqlStr.=$comma."'".mysql_escape_string($row [$i])."'"; $comma=','; } $sqlStr.=");\r\n"; } } $sqlStr.="\r\n"; } return $sqlStr; } /****************************************************************** -- 函数名:readSql($filePath) -- 作 用:读取SQL文件并过滤注释 -- 参 数:$filePath SQL文件路径(必填) -- 返回值:字符串/布尔/数组 -- 实 例:无 *******************************************************************/ public function readSql($filePath){ if (!file_exists($filePath)) return false; $sql=file_get_contents($filePath); if (empty($sql)) return ''; $sql=preg_replace('/(\/\*(.*)\*\/)/s','',$sql); //过滤批量注释 $sql=preg_replace('/(--.*)|[\f\n\r\t\v]*/','',$sql); //过滤单行 注释与回车换行符 $sql=preg_replace('/ {2,}/',' ',$sql); //将两个以上的连续空格替 换为一个,可以省略这一步 $arr=explode(';',$sql); $sql=array(); foreach ($arr as $str){ $str=trim($str); if (!empty($str)) $sql[]=$str; } return $sql; } /****************************************************************** -- 函数名:saveSql($sqlPath,$table) -- 作 用:将当前数据库信息保存为SQL文件 -- 参 数:$sqlPath SQL文件保存路径,如果为空则自动以当前日期为文件 名并保存到当前目录(选填) $table 待保存的表名,为空着表示保存所有信息(选填) -- 返回值:字符串 -- 实 例:$DB->saveSql('../mydb.sql'); *******************************************************************/ public function saveSql($sqlPath='',$table=''){ if (empty($table)){ $result=$this->query('SHOW TABLES'); while ($arr=$this->fetch_row($result)){ $str=$this->makeSql($arr[0]); if (!empty($str)) $sql.=$str; } $text="/*************************************************************** \\r\\n"; $text.="-- Database: $this->data\r\n"; $text.="-- Date Created: ".date('Y-m-d H:i:s')."\r\n"; $text.="***************************************************************/ \r\n\r\n"; }else{ $text=''; $sql=$this->makeSql($table); } if (empty($sql)) return false; $text.=$sql; $dir=dirname($sqlPath); $file=basename($sqlPath); if (empty($file)) $file=date('YmdHis').'.sql'; $sqlPath=$dir.'/'.$file; if (!empty($dir)&&!is_dir($dir)){ $path=explode('/',$dir); $temp=''; foreach ($path as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ if (!mkdir($temp,0777)) return false; } } $sqlPath=$temp.$file; } $link=fopen($sqlPath,'w+'); if (!is_writable($sqlPath)) return false; return fwrite($link,$text); fclose($link); } /****************************************************************** -- 函数名:loadSql($filePath) -- 作 用:从SQL文件导入信息到数据库 -- 参 数:$filePath SQL文件路径(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function loadSql($filePath){ $val=$this->readSql($filePath); if ($val==false) $this->show_error($filePath.'不存在'); elseif (empty($val)) $this->show_error($filePath.'中无有效数 据'); else{ $errList=''; foreach ($val as $sql){ $result=mysql_query($sql); if (!$result) $errList.='执行语句'.$sql.'失败<br />'; } return $errList; } return false; } // 释放结果集 public function free(){mysql_free_result($this->result);} // 关闭数据库 public function close(){mysql_close($this->conn);} // 析构函数,自动关闭数据库,垃圾回收机制 public function __destruct(){ $this->free(); $this->close(); } } ?>
韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的数据库(sql server,mysql , access) 教程推荐:oracle使用教程, 深入浅出oracle 记住:欲速则不达,做任何事情要遵循他的规律,循序渐进,信心很重要 成为一个oracle高手过程:理解小知识点->做小练习->把小的只是点连成线->做oracle项目->形成只是面->深刻理解 Oracle基础部分:oracle基础使用; oracle用户管理; oracle表管理 Oracle高级部分:oracle表的查询; oracle的函数; oracle数据库管理;oracle 的权角色; pl/sql 编程; 索引,约束和事物。 期望目标: 1 学会安装、启动、卸载oracle 2 使用sql *plus工具 3 掌握oracle用户管理 4 学会在oracle中编写简单的select语句 第1讲:基础语法 内容介绍: 1.为什么学习oracle 2.介绍oracle及其公司的背景 3.学会安装、启动、卸载oracle 4.oracle开发工具 5.Sql*plus的常用命令 6.oracle用户管理 一、主流数据库包括: ?微软:sql server 和 access ?瑞典:mysql AB公司 ?IBM公司:DB2 ?美国sybase公司:sybase ?IBM公司:infromix ?美国oracle公司:oracle(目前最流行的之一) 数据库分类: 小型数据库 中型数据库 大型数据库 mysql Sybase access sql server Oracle informix DB2 负载量在100人内,比如比如在负载日访问量负载可以处理海量数据板,信息系信息留言统。 5000-15000 库 sybase<oracle<db2 成本低 成本在万元内 大型数据库的安全性能 安全性要求不高 比如商务网站 高,价格也很昂贵~万 元以上 二、oracle安装,启动及卸载 1.系统要求: 操作系统最好为windows2000 内存最好在256M以上 硬盘空间需要2G以上 2.oracle安装会自动的生成sys和system两个用户 2 说明: 1Sys用户 是 超级用户,具有最高权限,具有sysdba角色,create database? 的权限,默认密码是manager 2System 用户 是 管理操作员,权限也很大,具有sysoper角色,没有create ? database权限,默认密码是 change_on_install 3一般讲,对数据库维护,使用system用户登录就可以了 ? 3.启动oracle 右键单击我的电脑->服务和应用程序:服务->启动OracleServiceMYORA1(MYORA1 是安装oracle时起的名字各有不同)和OracleOracleHome90TNSLlistener 4.卸载oracle 1、先关掉oralce,net stop OracleServiceORCL(ORCL是我的实例名字,换成你的),或者去我的电脑服务中关闭 2、开始,,程序,,Oracle - oracle的版本号,我的是10ghome,,Oracle Installation Products,, Universal Installer 卸载oracle 3、进注册表,regedit,删除选择 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE下所有的key。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\App lication这个里面所有有oracle这个字眼的,删除 4、删除c盘\Program Files\Oracle目录的东西以及oracle安装目录下所有的文件以及文件夹 5、环境变量中删除有关oracle的classpath和path ,, 三、oracle开发工具, Sqlplus是Oracle自带的工具软件,主要用于执行sql语句,pl/sql块。,如何使用:,, 1)在开始,程序,oracle,orachome90,, ,,application,development,sql*plus(这个是在dos下操作), 2)在运行栏中输入:sqlplusw或者sqlplus即可, 3)在开始,程序,oracle,orahome90,, Application,development,sql*plus,worksheet,,4)pl/sql,developer,属于第三方软件,主要用于开发,测试,优化oracle,pl/sql,的 存储过程.如:触发器,此软件oracle不带,需要单独安装。,5)oracle的企业管理器(oem,oracle,enterprise,manager),位置在,,开始,程序,oracle,oracle,oraclehome90,enterprise,manager,console, ,,即可启动oracle的企业管理器,是一个图形界面环境, , , , 四、Sql*plus的常用命令, 3 1.连接命令 (1) conn[ect] 用法:conn 用户名/密码 @ 网络服务名[as sysdba/sysoper](角色登陆)当 用特权用户身份连接时,必须带上as sysdba 或是 as sysoper 例:conn scott/tiger; show user; 显示当前用户 2.断开连接命令 (2) disc[onnect] 说明:该命令用来断开与当前数据库的连接 (3)passw[ord] 说明:该命令用于修改用户名的密码。如果要想修改其他用户的密码,需要用sys/system登陆。 (4) show user 说明:显示当前用户名 (5) exit 说明:该命令会断开与数据库的连接,同时会退出sql*plus 3.文件操作命令 (1) start和@ 说明:运行sql脚本 案例:sql>@ d:\a.sql 或者 sql>start d:a.sql (2) edit 说明:该命令可以编辑指定的sql脚本。 案例:sql>edit d:\a.sql (3) spool 说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。 案例:sql>spool d:\b.sql 并输入 sql>spool off 4(交互式命令 (1), 说明:可以替代变量,而该变量在执行时,需要用户输入。如:sql>select * from emp where job=‘&job;’ 输入job是注意大小写 (2) edit 说明:该命令可以编辑指定的sql脚本 案例: sql>edit d:\a.sql 5.显示和设置环境变量 概述:可以用来控制输出的各种格式,set show 如果希望永久的保存相关的设置,可以去修改 glogin.sql脚本 (1)linesize 说明:设置显示行的宽度,默认是80个字符 sql>show linesize sql>set linesize 90 (2)pagesize 说明:设置每页显示的行数目,默认是14,用法和linesize一样,至于其他环境参数的使用也是大同小异 sql>set pagesize 8 实际得到的不是14/8=2页 而是:14/(8-3)=5页 五Oracle用户的管理 4 1.创建用户 概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用create user 用户名 identified by 密码; 2.给用户修改密码 概述:如果给自己修改密码可以直接使用 sql>password 用户名 如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限 sql>alter user 用户名 identified by 新密码 3.删除用户 概述:一般以dba的身份去删除某个用户,如果用其他用户去删除用户则需要具有 drop user的权限。 比如 drop user 用户名【cascade】 注意:在删除用户时,如果要删除的用户已经创建了表,就需要在删除的时候带一个参数cascade 4.用户管理的综合案例 概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限(connect登陆,dba管理员,resource建表)使用命令grant,回收权限使用命令revoke. 为了给讲清楚用户管理,给大家举一个案例。 案例: 新建一个用户lady 并给该用户赋可登陆可创建表 Sql>create user lady identified by lady123(密码) 受登陆权限:,grant connect to lady 受可创建表:grant resource to lady 可以多个同时授权:grant connect,resource to lady; 注意授权用户级别应该为(dba以上sys/system) 还可以使用PL/SQL工具创建:文件->新建->用户 现在我要把scott用户里面的emp表的权限赋给lady用户但lady只能有对emp查询权限: grant select on emp to lady;(授权用户级别应该:授权本身,或者sys/system) lady 查询emp的方式:select * from scott.emp; 案例:同上我想把update的权限也赋给leng , grant update on emp to leng; 2)我想把emp所有的(增,删,改,查/insert,delete,update,select这四个一起可以用all代替) 操作权限赋给leng grant all on emp to leng;(此时登陆用户为scott) 案例2:这时我想把权限收回来怎么办呢, 这时用关键字revoke(撤回), revoke select on emp from lady; 收回lady的查权限 案例: 5 现在scott希望吧查询emp表权限通过lady用户继续给别的用户, Scott > grant select on emp to lady with grant option; Leng > grant select on scott.emp to 新建用户 案例: scott想把emp表的权限从leng用户赋权给新用户yoyo; Scott> grant select on emp to leng with grant option; Leng> grant select on scott.emp to yoyo; Yoyo> select * from scott.emp; 如果是对象权限,就加入with grant option 例:grant select on emp to xiaoming with grant option 如果是系统管理权限,system 给xiaoming权限时: 例:grant connect to xiaoming with admin option 如果scott把xiaoming 对emp表的查询权限回收,那么xiaohong会怎么样 Scott->xiaoming->xiaohong ,结果就是xiaoming,xiaohong,都不能查询emp表
目录 摘要 3 ABSTRACT 3 1. 灾难类型 4 2. 恢复类型 4 3. 恢复的级别 4 4. 需要防止的故障级别 4 4.1 可接受的数据丢失量 5 4.2 允许用于恢复的时间量 5 4.3 备份和恢复 5 5. 灾难恢复方案 5 5.1 简单备份 6 5.2 备份和日志保留 7 6. 高级存储备份 8 7. 数据库恢复 9 摘要 随着数据库技术在各个行业和各个领域大量广泛的应用,在对数据库应用的过程中,人为误操作、人为恶意破坏、系统的不稳定、存储介质的损坏等等原因,都有可能造成重要数据的丢失。一旦数据出现丢失或者损坏,都将给企业和个人带来巨大的损失。这就需要进行数据库恢复。 关键词:数据库技术;灾难性;恢复;数据备份 ABSTRACT With the database technology in various industries and a large number of wide application in various fields, in the process of database applications, artificial misuse, human vandalism, system instability, damage to storage media and other reasons may have resulted in important data lost. Once the data appears lost or damaged, both businesses and individuals will give enormous losses. This need for database recovery. Abstract: Database technology; catastrophic; recovery; Data BackupDevice Driver; Data Backup; Logical Block Address; 数据库灾难性恢复 1. 灾难类型 为了使数据库损失降低到最小程度,需要一个恢复策略,确保它起作用,并经常实行策略,一些灾难类型包括: 1. 系统故障。电源故障、硬件故障或软件故障都能够使数据库处于不一致状态。 2. 事务故障。用户无意中会用错误数据修改数据库,从而毁坏数据库。 3. 介质故障。如果磁盘驱动器变得不能使用,那么可能会丢失所有或部分数据。 4. 自然灾难。系统所在的设施可能会遭受火灾、洪水或其它类似灾难的损坏。 2. 恢复类型 DB2 考虑到了下列恢复类型: 1. 崩溃恢复。这种类型的恢复通过撤销(回滚)未提交的事务来防止数据库处于不一致状态。 2. 版本恢复。这种类型的恢复通过使用从 BACKUP 命令获取的备份映像来恢复先前的数据库版本。恢复的数据库将包含在执行 BACKUP 命令时所处状态的信息。如果在执行备份之后针对数据库执行进一步操作,那么该信息将丢失。 3. 前滚恢复。这种类型的恢复通过使用完全数据库备份,结合日志文件来扩展版本恢复。必须先恢复备份以用作基线;然后在该备份之上应用日志。该过程会将数据库或表空间恢复到某个特定时间点。前滚恢复要求启用归档日志记录。 3. 恢复的级别 建立灾难恢复计划对于现代企业至关重要。企业数据库中的信息对于进行业务活动是极其重要的。保护该数据以及在灾难之后确保其“生命”是很重要的活动。当构建 DR计划时,有三个关键级别问题。 4. 需要防止的故障级别 要防止的故障级别通常是近似性问题。原始数据与其备份之间在物理上有多紧密?备份数据可以在不同的驱动器上、在独立的机器上、在独立的楼层上或在不同的建筑物里。不可能预测所有可能的灾难。火灾、水灾或甚至用户的恶作剧都可能是企业必须面对的问题。解决方案的设计应该包括公司希望防止最坏情况的方案。 4.1 可接受的数据丢失量 所有企业都不希望在故障之后丢失任何数据。虽然不丢失数据是可能的,但由于可能需要的复杂性和费用(尤其是如果所防止的故障级别非常高),这通常是不实际的。可接受的数据丢失量取决于数据对公司有多重要以及有什么资源可用于确保其生命。 4.2 允许用于恢复的时间量 恢复所需的时间量类似于高可用性的目标。它与高可用性解决方案之间的差异在于所防止的故障类型以及通常认为合理的时间长度。HA 故障转移通常以秒和分钟来衡量,而灾难恢复则可能以小时和天来进行衡量。不过并非总是这样,但这个差异区分了对这些解决方案的相对期望。 4.3 备份和恢复 数据库备份创建数据库的时间点映象,它是灾难恢复解决方案的基本组件。DB2 提供了几种备份,包括脱机备份、联机备份和增量备份。从备份恢复所需的时间取决于数据库的大小和可用于执行恢复的硬件资源。 由于数据库备份只捕获时间点的数据,因此无法通过一个简单恢复来恢复备份之后发生的任何数据更改。要恢复备份之后完成的事务,就需要应用日志文件。可以从备份和日志文件(通过在日志文件中进行“前滚”来应用)来恢复数据库。这允许恢复到某个时间点或恢复到日志文件结束。 因此,如果 DR 解决方案必须恢复自上次备份以来的事务,那么保留日志文件是非常关键的。有两个提高日志保留的 DB2 特性:双日志记录和用户出口工具,已在关于数据库复制 HA 选项的部分中进行了讨论。 5. 灾难恢复方案 灾难恢复方案可以分成三类:简单备份、备份和日志保留、高级存储备份 。 虽然不是每个解决方案都清晰地被划入这三类中的某一类,但它们确实为您理解灾难恢复选项提供了合理的框架。 5.1 简单备份 MySQL表保存为文件方式,很容易备份。要想保持备份的一致性,对相关表执行LOCK TABLES操作,然后对表执行FLUSH TABLES。你只需要读锁定;这样当你复制数据库目录中的文件时,允许其它客户继续查询表。需要FLUSH TABLES语句来确保开始备份前将所有激活的索引页写入硬盘。 备份数据库的另一个技术是使用mysqldump程序或mysqlhotcopy脚本。 1. 完全备份数据库: 2. shell> mysqldump --tab=/path/to/some/dir --opt db_name 或: shell> mysqlhotcopy db_name /path/to/some/dir 只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。 3. 如果mysqld在运行则停止,然后用--log-bin[=file_name]选项来启动。二进制日志文件中提供了 执行mysqldump之后对数据库的更改进行复制所需要的信息。 对于InnoDB表,可以进行在线备份,不需要对表进行锁定; MySQL支持增量备份:需要用--log-bin选项来启动服务器以便启用二进制日志;当想要进行增量备份时(包含上一次完全备份或增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制到备份位置。这些二进制日志为增量备份;恢复时,按照下面的解释应用。下次进行完全备份时,还应使用FLUSH LOGS或mysqlhotcopy --flushlogs回滚二进制日志。如果MySQL服务器为从复制服务器,则无论选择什么备份方法,当备份从机数据时,还应备份master.info和relay-log.info文件。恢复了从机数据后,需要这些文件来继续复制。如果从机执行复制LOAD DATA INFILE命令,你应还备份--slave-load-tmpdir选项指定的目录中的SQL_LOAD-*文件。(如果未指定,该位置默认为tmpdir变量值)。从机需要这些文件来继续复制中断的LOAD DATA INFILE操作。 如果必须恢复MyISAM表,先使用REPAIR TABLE或myisamchk -r来恢复。99.9%的情况下该方法可以工作。如果myisamchk失败,试试下面的方法。请注意只有用--log-bin选项启动了MySQL从而启用二进制日志它才工作; 1. 恢复原mysqldump备份,或二进制备份。 2. 执行下面的命令重新更新二进制日志: 3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql 在某些情况下,你可能只想要从某个位置重新运行某些二进制日志。(通常你想要从恢复备份的日期重新运行所有二进制日志,查询不正确时例外)。 还可以对具体文件进行选择备份: • 要想复制表,使用SELECT * INTO OUTFILE 'file_name' FROM tbl_name。 要想重载表,使用LOAD DATA INFILE 'file_name' REPLACE ...并恢复。要避免复制记录,表必须有PRIMARY KEY或一个UNIQUE索引。当新记录复制唯一键值的旧记录时,REPLACE关键字可以将旧记录替换为新记录。 如果备份时遇到服务器性能问题,可以有帮助的一个策略是在从服务器而不是主服务器上建立复制并执行备份。如果使用Veritas文件系统,可以这样备份: 1. 从客户端程序执行FLUSH TABLES WITH READ LOCK。 2. 从另一个shell执行mount vxfs snapshot。 3. 从第一个客户端执行UNLOCK TABLES。 4. 从快照复制文件。 5. 卸载快照。 只创建数据库备份确实创建了一个 DR 解决方案。它也许是非常有限的,这取决于您的环境。通过从“活动”的系统上移走所创建的备份,可以提高保护的级别。增加数据库备份的频率也降低了数据丢失的风险。备份软件对于创建和维护 DB2 备份可能非常有帮助。例如,IBM 的 Tivoli Storage Manager 和 Veritas 的 Net Backup® 都提供了允许在其软件控制的设备上直接备份和维护 DB2 数据库的解决方案。这些设备可以是磁带库或另一种存储设备。 简单备份适合于只读数据库或由能轻松重新创建的批处理作业填充的数据库,或者在备份之间不必维护数据库更改的情况下。 表 1.简单备份的优缺点 优点: 缺点: 保护级别: 数据库备份可以转移到外部位置,以提高保护级别 数据丢失的风险: 备份之间的数据更改可能会丢失(运行增量备份来降低风险的影响) 恢复所需的时间: 数据库恢复需要很长时间 5.2 备份和日志保留 保留数据库日志文件与数据库备份一起创建了更完善的 DR 解决方案。日志文件允许恢复备份之间发生的数据更改。该解决方案的真正复杂性在于保护日志文件以确保它们在恢复期间的可用性。如果选择实现双日志记录,DB2 可以将日志文件放在不同的位置,如果确保这些位置在不同的存储器阵列上,那么保护级别就会得到提高。但是,日志文件仍面临存储子系统故障。如在高可用性的日志传送选项中所提到的,用户出口程序可以提供重定位日志文件的替代方法。 用户出口可以将已关闭的日志文件移到当前系统可用存储阵列之外的位置,从而提高保护级别。这里的告诫是它只移动已关闭的日志文件。即使已实现了双日志记录,包含活动事务的日志文件仍面临因阵列丢失或存储设备故障而产生的丢失。该解决方案适合于大多数面向商业事务的环境。 它均衡了最小化数据丢失风险的需要和维护 DR 解决方案所需的成本。 表 2.备份加日志保留的优缺点 优点: 缺点: 保护级别: 数据库备份可以转移到外部位置,以提高保护级别 数据丢失的风险: 如果使用适当的步骤来维护日志文件,会大大降低数据丢失的风险 恢复所需的时间: 数据库恢复需要时间,应用日志文件将增加恢复时间 6. 高级存储备份 我们在高可用性下的高级存储选项部分中讨论过这个主题,相同的原则在这里也适用。正如在那部分中所见的,STANDBY方法允许当数据库副本处于暂挂状态时在辅助系统上执行数据库备份。 创建数据库副本已经创建了 DR解决方案的一部分。备份副本提高了保护级别。如果用双日志记录和用户出口程序正确实现了这个高级存储备份,那么它就为核心企业数据库生成了最好的 DR解决方案。 该解决方案最适合处于企业活动核心的数据库系统。示例可能包含了供应链管理和在线代理系统。 表 3.用于灾难恢复的高级存储备份优缺点 优点: 缺点: 保护级别: 保护级别本来就很高,而且可以通过耦合存储子系统来提高保护级别。 数据丢失的风险: 如果采用双日志记录和用户出口程序,会大大降低数据丢失的风险 恢复所需的时间: 恢复所需的时间非常短。 7. 数据库恢复 数据库恢复中心理解为: (1)当数据库出现损伤或由于人员误操作、操作系统本身故障所造成的数据看不见、无法读取、丢失。工程师通过技术手段读取将数据都恢复为可以读的数据,数据恢复不是靠一两种软件就可以完成,往往需要数个工程师靠经验不同的方式才能恢复数据,当然数据库恢复还包括各种操作系统:除普通的WINDOWS外,还有Unix、Linux、APPLE机,而以UNIX为多。 (2)数据库数据已经存在,但是无法正常使用,提示错误,都应归属为数据修复,举例说明:SQL SERVER文件打开提示LDF文件损坏,或错误823等等。 数据库恢复实际上就是利用技术手段把不可见或不可正常运行的数据文件恢复成正常运行的过程。 方法一 如何附加数据库(企业管理器) 1、展开服务器组,然后展开服务器。 2、右击"数据库",然后选择"所有任务"/"附加数据库"。 3、输入要附加的数据库的 MDF(master 数据文件)名称。如果不确定文件位于何处,单击浏览("...")搜索。最多可以指定16个文件名。 4、若要确保指定的MDF文件正确,请单击"验证"。"原文件名"列列出了数据库中的所有文件(数据文件和日志文件)。"当前文件位置"列列出了文件的名称和路径。如果Microsoft? SQL Server? 找不到指定位置的文件,则附加操作将失败。可以对"当前文件位置"列进行编辑,并且文件的当前位置必须在该列中才能使附加操作得以进行。例如,如果在分离操作前改变了文件的默认位置,则必须指定当前位置才能使附加操作顺利进行。 5、在"附加为"框内,输入数据库的名称。数据库名称不能与任何现有数据库名称相匹配 6、指定数据库的所有者。 7、单击"确定"按钮。新附加的数据库数据库节点即创建在"数据库"文件夹中。 方法二 sp_attach_db 将数据库附加到服务器。 语法 sp_attach_db [ @dbname = ] 'dbname' , [ @filename1 = ] 'filename_n' [ ,...16 ] 参数 [@dbname =] 'dbname' 要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。 [@filename1 =] 'filename_n' 数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。 返回代码值 0(成功)或 1(失败) 结果集 无 注释 只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库执行 sp_attach_db。如果必须指定多于 16 个文件,请使用带有 FOR ATTACH 子句的 CREATE DATABASE。 如果将数据库附加到的服务器不是该数据库从中分离的服务器,并且启用了分离的数据库以进行复制,则应该运行 sp_removedbreplication 从数据库删除复制。 权限 只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。 示例 下面的示例将 pubs 中的两个文件附加到当前服务器。 EXEC sp_attach_db @dbname = N'pubs', @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf' 请参见 CREATE DATABASE sp_attach_single_file_db sp_detach_db sp_helpfile sp_removedbreplication 系统存储过程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值