Category: SQL

Oracle备份与恢复(逻辑备份)

逻辑备份:是利用SQL语言从数据库中抽取数据并存于二进制文件的过程。

逻辑备份使用导入导出工具:EXPDP/IMPDP或EXP/IMP;

EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。

EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。

IMP只适用于EXP导出的文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。

使用EXP/IMP导出/导入包括三种方式:

  • 表方式(T)    可以将指定的表导出备份;
  • 用户方式(U)     可以将指定的用户相应的所有数据对象导出;
  • 全库方式(Full)     将数据库中的所有对象导出;
-- exp导出模式
 
--表模式
exp system/oracle@orcl OWNER=jalena TABLES=scott.dept,scott.emp FILE=a.dmp
 
-- 用户模式
exp system/oracle@orcl OWNER=jalena FILE=b.dmp
 
--全库模式
exp system/oracle@orcl FILE=c.dmp FULL=Y

-- EXPDP 导出模式

-- 1. 指定 DIRECTORY 【指定转储文件和日志文件所在的目录】
create or replace directory DUMP_DIR as 'd:/Export Directory';

-- 2. CONTENT 该选项用于指定要导出的内容.默认值为ALL
/* 
 * CONTENT = {ALL | DATA_ONLY | METADATA_ONLY}
 * DATA_ONLY 只导出对象数据
 * METADATA_ONLY 只导出对象定义
 */
expdb nc57/a@orcl directory=DUMP_DIR dumpfile=nc57.dmp CONTENT=METADATA_ONLY	  -- 只导出对象定义
expdb nc57/a@orcl directory=DUMP_DIR dumpfile=nc57.dmp CONTENT=DATA_ONLY		  -- 导出所有数据

-- 3. DUMPFILE 用于指定转储文件的名称,默认名称为 expdat.dmp
expdb nc57/a@orcl directory=DUMP_DIR dumpfile=nc57.dmp logfile=nc57.log

-- 4. 授权nc57用户对DUMP_DIR有读取、写入权限
grant read,write on directory DUMP_DIR to nc57;

-- 5. 查看目录及权限
SELECT privilege,
       directory_name,
       directory_path
  FROM user_tab_privs  t,
       all_directories d
 WHERE t.table_name(+) = d.directory_name
 ORDER BY 2,
          1;

-- 导出语句后面不要有分号!!!!!!!!!!!!!

-- 数据泵导出的各种模式:
-- 1、按表模式导出:
expdp nc57/a@orcl tables=sm_user dumpfile=expdp_test2.dmp logfile=expdp_test2.log directory=DUMP_DIR

-- 2、按查询条件导出:
expdp nc57/a@orcl tables=sm_user dumpfile=expdp_test3.dmp logfile=expdp_test3.log directory=DUMP_DIR query='"where PWDLEVELCODE='update'"'

-- 3、按表空间导出:
Expdp nc57/a@orcl dumpfile=expdp_tablespace.dmp tablespaces=GCOMM.DBF logfile=expdp_tablespace.log directory=DUMP_DIR

-- 4、导出方案
Expdp nc57/a DIRECTORY=DUMP_DIR DUMPFILE=schema.dmp SCHEMAS=nc57,nc63

-- 5、导出整个数据库:
expdp nc57/a@orcl dumpfile=full.dmp full=y logfile=full.log directory=DUMP_DIR
-- imp 导入模式

/* 创建用户及授权 */
create user nc57 identified by nc57;
GRANT connect,dba to nc57; 
 
-- 表模式
imp nc57/nc57@orcl OWNER=jalena tables=scott.dept,scott.emp file=a.dmp
 
-- 用户模式
imp nc57/nc57@orcl fromuser=jalena file=b.dmp
 
-- 全库模式
imp nc57/nc57@orcl file=c.dmp full=y

-- impdp导入模式:

-- 1、按表导入
-- p_street_area.dmp文件中的表,此文件是以 nc57 用户按schemas=nc57导出的:
impdp nc57/nc57@orcl dumpfile=p_street_area.dmp logfile=imp_p_street_area.log directory=dir_dp tables=p_street_area

-- 2、按用户导入(可以将用户信息直接导入,即如果用户信息不存在的情况下也可以直接导入)
impdp nc57/nc57@orcl schemas=nc57 dumpfile =expdp_test.dmp logfile=expdp_test.log directory=dir_dp

-- 3、不通过expdp的步骤生成dmp文件而直接导入的方法:
-- 从源数据库中向目标数据库导入表 p_street_area
-- igisdb是目的数据库与源数据的链接名,dir_dp是目的数据库上的目录
impdp nc57/nc57 directory=dir_dp NETWORK_LINK=igisdb tables=p_street_area logfile=p_street_area.log

-- 4、更换表空间 采用remap_tablespace参数 导出 nc57 用户下的所有数据
expdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp SCHEMAS=gwm
-- 注:如果是用sys用户导出的用户数据,包括用户创建、授权部分,用自身用户导出则不含这些内容
--以下是将gwm用户下的数据全部导入到表空间gcomm(原来为gmapdata表空间下)下
impdp system/orcl directory=data_pump_dir dumpfile=gwm.dmp remap_tablespace=gmapdata:gcomm

后记:

ORACLE 11G中有个新特性,当表无数据时,不分配segment,以节省空间

解决方法:

 1、insert一行,再rollback就产生segment了。

该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

 2、设置deferred_segment_creation 参数

C:\Users\Jalena>sqlplus sys/sa@127.0.0.1/orcl as SYSDBA
 
SQL*Plus: Release 11.2.0.1.0 Production on 星期五 10月 28 21:57:16 2016
 
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
 
连接到:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
 
SQL> show parameter deferred_segment_creation
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
 
SQL> alter system set deferred_segment_creation=false;
 
系统已更改。
 
SQL> show parameter deferred_segment_creation
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     FALSE
 
SQL>

该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。

需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。

第一种方法打包脚本:exp打包脚本(使用的时候修改expHandleNulTable.bat里用户及密码,执行后再将result.txt里面的alert语句拷贝执行即可)

ORACLE强行断开用户链接

首先查找目标用户的进程

select sid,serial# from v$session where username='CRM';

使用此语句会返回一个进程列表,每行有两个数字,然后用数字替代下面的sid和serial

alter system kill session 'sid,serial';

通过select查询的语句可能会出现多行记录。也可以批量生成语句

SELECT 'alter system kill session ' || '''' ||t.sid ||','||t.SERIAL#|| '''' FROM v$session t WHERE t.USERNAME='CGBCRM';

/* NC57 删除数据库 */
drop user NC57 cascade;   

/* 创建数据库并为用户赋予权限 */
CREATE USER NC57 IDENTIFIED BY a DEFAULT TABLESPACE NNC_DATA01 TEMPORARY  TABLESPACE temp;   
GRANT connect,dba to NC57;

PLSQL Developer远程连接配置

PLSQL Developer 序列号

  • Product Code(产品编号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz
  • serial Number(序列号):601769
  • password(口令):xs374ca

安装步骤

  1. 安装PL/SQL
  2. 下载 instantclient basic包
  3. 解压Oracle客户端(放置位置无强制要求,可随意放置)
  4. 设置客户端路径(选择 工具-> 首选项 -> 连接,配置其中的Oracle 主目录和OCI 库项)
    • Oracle 主目录:    D:\app\Jalena\product\instantclient_12_1
    • OCI 库:    D:\app\Jalena\product\instantclient_12_1\oci.dll

设置远程连接(直接修改文件容易造成编码问题)

PL/SQL Developer登入时候报ORA-12638: 身份证明检索失败的解决办法

找到安装目录:D:\app\Jalena\product\11.2.0\dbhome_1\NETWORK\ADMIN 打开sqlnet.ora
在里面找到 SQLNET.AUTHENTICATION_SERVICES= (NTS)
将其更改为: SQLNET.AUTHENTICATION_SERVICES= (BEQ,NONE)
或者注释掉:#SQLNET.AUTHENTICATION_SERVICES= (NTS)

方法二、Net Manager

直接使用Net Manager工具,选择《Oracle Net配置》——《本地》——《服务命名》,点击左侧《+》添加即可。

最后点击《文件》——《保存网路配置》

bootstrap table 服务端搜索/分页/异步刷新

最近项目中用到了很多的Table,在jsp中构建的话太过繁琐,不宜与后续dom的操作。所以特意研究了一下Bootstrap Table这个插件!!

Java Json包 https://github.com/FasterXML/jackson

插件地址:Bootstrap Table

使用该插件需要Jquery与Bootstrap支持

Html部分

<!DOCTYPE html>
<html lang="en">
 
<head>
	<meta charset="UTF-8">
	<title>Deomo</title>
	<link rel="stylesheet" href="/assets/css/bootstrap.min.css" />
	<link rel="stylesheet" href="/assets/css/bootstrap-table.min.css">
</head>
 
<body>
	<!--查询窗体-->
	<div class="widget-content">
		<form method="post" class="form-horizontal" id="eventqueryform">
			<input type="text" class="span3" name="eventName" placeholder="事件名称"> <input type="text" class="span2" name="status" placeholder="灾情状态"> 
			<input type="text" class="span3" name="location" placeholder="发现位置">
			<div data-date="" class="input-append date datepicker" data-date-format="yyyy-mm-dd">
				<input type="text" class="span10" name="startdate" placeholder="起始日期"> <span class="add-on"><i class="icon-th"></i></span>
			</div>
			<div data-date="" class="input-append date datepicker" data-date-format="yyyy-mm-dd">
				<input type="text" class="span10" name="enddate" placeholder="结束日期"> <span class="add-on"><i class="icon-th"></i></span>
			</div>
			<input type="button" class="btn btn-default span1" id="eventquery" value="查询">
		</form>
	</div>
 
	<div class="widget-content">
		<!--工具条-->
		<div id="toolbar">
			<button class="btn btn-success btn-xs" data-toggle="modal" data-target="#add">添加事件</button>
		</div>
		<table id="eventTable"></table>
	</div>
 
	<script src="/assets/js/jquery.min.js"></script>
	<script src="/assets/js/bootstrap.min.js"></script>
	<script src="/assets/js/bootstrap-table.min.js"></script>
	<script src="/assets/js/bootstrap-table-zh-CN.min.js"></script>
	<script src="/assets/js/event.js"></script>
 
</body>
 
</html>

JS部分

$(document).ready(function() {
	// 初始化表格
	initTable();
});

// 表格初始化
function initTable() {
	$('#eventTable').bootstrapTable({
		method: 'post', // 向服务器请求方式
		contentType: "application/x-www-form-urlencoded", // 如果是post必须定义
		url: '/program/event/findbyitem', // 请求url
		cache: false, // 是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
		striped: true, // 隔行变色
		dataType: "json", // 数据类型
		pagination: true, // 是否启用分页
		showPaginationSwitch: false, // 是否显示 数据条数选择框
		pageSize: 5, // 每页的记录行数(*)
		pageNumber: 1, // table初始化时显示的页数
		search: false, // 不显示 搜索框
		sidePagination: 'server', // 服务端分页
		classes: 'table table-bordered', // Class样式

		// showRefresh : true, // 显示刷新按钮

		silent: true, // 必须设置刷新事件

		toolbar: '#toolbar', // 工具栏ID
		toolbarAlign: 'right', // 工具栏对齐方式

		queryParams: queryParams, // 请求参数,这个关系到后续用到的异步刷新

		columns: [{
			field: 'eventName',
			title: '事件名称',
			align: 'center'
		}, {
			field: 'date',
			title: '日期',
			align: 'center'
		}, {
			field: 'location',
			title: '发生位置',
			align: 'center'
		}, {
			field: 'mesures',
			title: '防治方案',
			align: 'center'
		}, {
			field: 'status',
			title: '灾情状态',
			align: 'center'
		}, {
			field: 'id',
			title: '操作',
			align: 'center',
			width: '280px',
			formatter: function(value, row, index) {
				var view = '查看 ';
				var update = '修改 ';
				var review = '申请专家会审 ';

				// console.log(JSON.stringify(row));

				if (row.status === '已得到控制') {
					return view + update
				} else {
					return view + update + review;
				}

			}
		}],
	});
}

// 分页查询参数,是以键值对的形式设置的
function queryParams(params) {
	return {
		eventName: $('#eventqueryform input[name=\'eventName\']').val(), // 请求时向服务端传递的参数
		status: $('#eventqueryform input[name=\'status\']').val(), // 请求时向服务端传递的参数
		location: $('#eventqueryform input[name=\'location\']').val(), // 请求时向服务端传递的参数
		startdate: $('#eventqueryform input[name=\'startdate\']').val(), // 请求时向服务端传递的参数
		enddate: $('#eventqueryform input[name=\'enddate\']').val(), // 请求时向服务端传递的参数

		limit: params.limit, // 每页显示数量
		offset: params.offset, // SQL语句偏移量
	}
}

// 搜索按钮触发事件
$(function() {
	$("#eventquery").click(function() {
		$('#eventTable').bootstrapTable(('refresh')); // 很重要的一步,刷新url!
		// console.log("/program/area/findbyItem?offset="+0+"&"+$("#areaform").serialize())
		$('#eventqueryform input[name=\'eventName\']').val('')
		$('#eventqueryform input[name=\'status\']').val('')
		$('#eventqueryform input[name=\'location\']').val('')
		$('#eventqueryform input[name=\'startdate\']').val('')
		$('#eventqueryform input[name=\'enddate\']').val('')
	});
});

表单验证(这里是应用项目中的)

Read more

Windows安装Mysql Zip绿色版

安装服务

REM 自动启动
mysqld --install
mysqld --defaults-file="D:\Program Files\mysql\mysql.ini" --initialize --explicit_defaults_for_timestamp
net start mysql

REM 手动启动
mysqld --install-manual
mysqld --defaults-file="D:\Program Files\mysql\mysql.ini" --initialize --explicit_defaults_for_timestamp
net start mysql

REM 卸载服务
mysqld --remove

初始密码

# mysql.ini 内容
[mysql]
default-character-set=utf8

[mysqld]
basedir = D:\Program Files\mysql
datadir = D:\Program Files\mysql\data 
port = 3306 
max_connections=200 
character-set-server=utf8 
default-storage-engine=INNODB   sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

查看Data目录下**.err文件,搜索"password is generated",结束就是初始密码

mysql初始密码是无法作为登陆使用的,所以登陆mysql必须修改自动生成的密码。

mysql -u root -h 127.0.0.1 -p
Enter password: (enter the random password here)
 
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
mysql> flush privileges;

SQL SERVER 数据类型

数据类型 类型 描述
bit 整型 bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes或No、True 或False 、On或Off
int 整型 int 数据类型可以存储从-231(-2147483648)到231(2147483647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
smallint 整型 smallint 数据类型可以存储从-215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
tinyint 整型 tinyint 数据类型能存储从0到255之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1个字节
numeric 精确数值型 numeric数据类型与decimal 型相同
decimal 精确数值型 decimal 数据类型能用来存储从-1038-1到1038
-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
money 货币型 money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220亿之间的数据,精确到货币单位的万分之一
smallmoney 货币型 smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647之间的数据,精确到货币单位的万分之一
float 近似数值型 float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
real 近似数值型 real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
datetime 日期时间型 datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
Smalldatetime 日期时间型 smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
cursor 特殊数据型 cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
timestamp 特殊数据型 timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
Uniqueidentifier 特殊数据型 Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
char 字符型 char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000个字符
varchar 字符型 varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
text 字符型 text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
nchar 统一编码字符型 nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
nvarchar 统一编码字符型 nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
ntext 统一编码字符型 ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230-1或将近10亿个字符,且使用的字节空间增加了一倍
binary 二进制数据类型 binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
varbinary 二进制数据类型 varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
image 二进制数据类型 image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

Archives