如何利用Direct NFS克隆数据库
CloneDB是Oracle 11.2.0.3推出的一项新特性,它利用的了11g新引入的Direct NFS。它直接利用目标数据库的备份,无需将备份COPY到克隆环境下,使得一个备份可以克隆多个不同用途的数据库。它同时采用了copy-on-write技术,使得备份中只有被修改了的block才会被应用到克隆数据库中,极大的节省了克隆数据库的空间,并提升了数据库克隆的速度。
下面对该项特性进行了测试,共涉及三台服务器,采用的均是32位RHEL 6.3操作系统,数据库版本11.2.0.4。
NFS服务器:
主机名:node3.being.com
IP: 192.168.2.13
共享路径:/u01
生产数据库:
主机名: node1.being.com
IP: 192.168.2.11
ORACLE_HOME: /u01/app/oracle/product/11.2.0.4/db_1
ORACLE_SID:prod
挂载点:/backup/prod/
克隆数据库:
主机名:node2.being.com
IP:192.168.2.12
ORACLE_HOME:/u01/app/oracle/product/11.2.0.4/db_1
ORACLE_SID:orcl
挂载点:/prod/backup
一、准备NFS环境
首先查看一下node3的磁盘情况
[root@node3 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 .8G .9G .6G % /
tmpfs 504M 504M % /dev/shm
/dev/sda4 20G 172M 19G % /u01
在这里,打算将/u01作为NFS磁盘共享出去。
在NFS Server的主配置文件中/etc/exports添加以下内容:
/u01 *(rw,no_root_squash)
在这里,注意/u01的权限,刚开始/u01默认的是755权限,node1挂载后,无法创建文件,报“Permission denied”。
修改/u01的权限
[root@node3 ~]# chmod /u01/
重启rpcbind和nfs服务
[root@node3 ~]# /etc/init.d/rpcbind restart
Stopping rpcbind: [FAILED]
Starting rpcbind: [ OK ]
[root@node3 ~]# /etc/init.d/nfs restart
Shutting down NFS daemon: [FAILED]
Shutting down NFS mountd: [FAILED]
Shutting down NFS quotas: [FAILED]
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
查看配置是否成功
[root@node3 ~]# showmount -e 192.168.2.13
Export list for 192.168.2.13:
/u01 *
将rpcbind和nfs服务设为开机自启动
[root@node3 ~]# chkconfig rpcbind on
[root@node3 ~]# chkconfig nfs on
二、在生产数据库上挂载NFS文件系统
以root身份登录,创建备份目录
[root@node1 ~]# mkdir /backup/prod
挂载node3提供的nfs磁盘
[root@node1 ~]# showmount -e 192.168.2.13
Export list for 192.168.2.13:
/u01 *
[root@node1 ~]# mount 192.168.2.13:/u01 /backup/prod/
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 .7G .6G .8G % /
tmpfs 400M 184M 217M % /dev/shm
/dev/sda1 194M 27M 158M % /boot
/dev/sda4 28G 11G 16G % /u01
192.168.2.13:/u01 20G 172M 19G % /backup/prod
挂载后,无法给/backup/prod修改文件属主和属组,譬如我想将该目录设置为oracle用户专享的,结果如下:
[root@node1 ~]# chown oracle.oinstall /backup/prod/
chown: changing ownership of `/backup/prod/': Invalid argument
后来发现实在无此必要,node1中/backup/prod的权限和node3中的/u01权限是相对应的,都是757。我以oracle用户的身份在该目录下创建文件,文件的属主和属组就分别是oracle和oinstall。
设置为开机自动挂载
在/etc/rc.local添加以下内容:
mount 192.168.2.13:/u01 /backup/prod/
三、在克隆数据库上挂载NFS文件系统
以root身份登录,创建备份目录,名字随意
[root@node2 ~]# mkdir -p /prod/backup
挂载node3提供的NFS共享盘
[root@node2 ~]# mount 192.168.2.13:/u01 /prod/backup/
[root@node2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 .7G .2G .0G % /
tmpfs 400M 400M % /dev/shm
/dev/sda1 194M 27M 158M % /boot
/dev/sdb 20G .2G 15G % /u01
192.168.2.13:/u01 20G 172M 19G % /prod/backup
同样设置开机自动挂载
在/etc/rc.local中添加以下内容:
mount 192.168.2.13:/u01 /prod/backup/
四、克隆数据库上启用Direct NFS
登录oracle账户,新建$ORACLE_HOME/dbs/oranfstab文件,内容如下:
[oracle@node2 ~]$ cat $ORACLE_HOME/dbs/oranfstab
server:node3.being.com
path:192.168.2.13
export:/u01
mount:/prod/backup
修改libodm11.so库文件的链接对象
[oracle@node2 lib]$ mv libodm11.so libodm11.so.bak
[oracle@node2 lib]$ ln -s libnfsodm11.so libodm11.so
五、备份生产数据库
支持三种备份方式:在线热备(类似于alter database begin backup)、offline 备份(需关闭数据库)、rman “BACKUP AS COPY”(不支持rman备份集)
在这里,我们选用rman备份
以oracle身份登录node1
[oracle@node1 ~]$ rman target /
RMAN> sql 'alter database begin backup';
RMAN> backup as copy database format '/backup/prod/%U';
RMAN> sql 'alter database end backup';
备份完毕后,查看/backup/prod中的备份文件
[oracle@node1 ~]$ ll /backup/prod/
total
-rw-r-----. oracle asmadmin Apr : 0cq553i6_1_1
-rw-r-----. oracle asmadmin Apr : cf_D-PROD_id-289579616_0aq553hp
-rw-r-----. oracle asmadmin Apr : data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_08q553gd
-rw-r-----. oracle asmadmin Apr : data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_07q553dp
-rw-r-----. oracle asmadmin Apr : data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_09q553hj
-rw-r-----. oracle asmadmin Apr : data_D-PROD_I-289579616_TS-USERS_FNO-4_0bq553i5
drwx------. root root Apr : lost+found
其中cf_D-PROD_id-289579616_0aq553hp为控制文件的备份
六、为克隆数据库创建pfile
登录生产数据库
[oracle@node1 ~]$ sqlplus / as sysdba
生成pfile
SQL> create pfile='/backup/prod/pfile.ora' from spfile;
修改参数文件,除将所有涉及到prod的地方改为orcl外,同时新增了一个参数CLONEDB=TRUE,这个是必需的,最后参数文件内容如下:
[oracle@node1 ~]$ cat /backup/prod/pfile.ora
orcl.__db_cache_size=
orcl.__java_pool_size=
orcl.__large_pool_size=
orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=
orcl.__sga_target=
orcl.__shared_io_pool_size=
orcl.__shared_pool_size=
orcl.__streams_pool_size=
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/control02.ctl'
*.db_block_size=
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=
*.open_cursors=
*.processes=
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
CLONEDB=TRUE
在克隆数据库中新建参数文件中涉及的目录
[oracle@node2 admin]$ mkdir -p /u01/app/oracle/admin/orcl/adump
[oracle@node2 admin]$ mkdir -p /u01/app/oracle/oradata/orcl/
[oracle@node2 admin]$ mkdir -p /u01/app/oracle/fast_recovery_area/orcl
七、克隆数据库
ORACLE官方文档中提供了两种方式,一种是利用oracle自身提供的脚本,一个是手动创建。
在这里,我们选择脚本方式,通过脚本执行过程中的输出,对比ORACLE官方文档,我们可以发现两者其实是一样的,只不过手动创建所需要的命令写到脚本里面去了。
首先在克隆数据库所在的主机上设置环境变量
[oracle@node2 ~]$ export MASTER_COPY_DIR=/prod/backup
[oracle@node2 ~]$ export CLONE_FILE_CREATE_DEST=/u01/app/oracle/oradata/orcl
[oracle@node2 ~]$ export CLONEDB_NAME=orcl
其中MASTER_COPY_DIR指的是备份所在的目录,CLONE_FILE_CREATE_DEST指的是数据文件、日志文件、控制文件所在的目录,CLONEDB_NAME指定数据库名
执行数据库提供的perl脚本,关于脚本所在的目录及其执行的方式,我们来看看官方的说明:

因为我的数据库版本为11.2.0.4,故直接COPY到home目录下
[oracle@node2 ~]$ cp /u01/app/oracle/product/11.2.0.1/db_1/rdbms/install/clonedb.pl ~
执行脚本
[oracle@node2 ~]$ perl clonedb.pl /prod/backup/pfile.ora crtdb.sql dbren.sql
在/home/oracle下会生成两个文件,crtdb.sql和dbren.sql
登录数据库,执行crtdb.sql
[oracle@node2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4. Production on Fri Apr :: Copyright (c) , , Oracle. All rights reserved. Connected to an idle instance. SQL> @crtdb.sql
SQL> SET FEEDBACK
SQL> SET NUMWIDTH
SQL> SET LINESIZE
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE
SQL>
SQL> STARTUP NOMOUNT PFILE=/u01/app/oracle/oradata/orcl/initorcl.ora
ORACLE instance started. Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
SQL> CREATE CONTROLFILE REUSE SET DATABASE orcl RESETLOGS
MAXLOGFILES
MAXLOGMEMBERS
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
GROUP '/u01/app/oracle/oradata/orcl/orcl_log1.log' SIZE 100M BLOCKSIZE ,
GROUP '/u01/app/oracle/oradata/orcl/orcl_log2.log' SIZE 100M BLOCKSIZE
DATAFILE
'/prod/backup/0cq553i6_1_1',
'/prod/backup/cf_D-PROD_id-289579616_0aq553hp',
'/prod/backup/data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_08q553gd',
'/prod/backup/data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_07q553dp',
'/prod/backup/data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_09q553hj',
'/prod/backup/data_D-PROD_I-289579616_TS-USERS_FNO-4_0bq553i5',
'/prod/backup/lost+found',
'/prod/backup/pfile.ora'
CHARACTER SET WE8DEC;
CREATE CONTROLFILE REUSE SET DATABASE orcl RESETLOGS
*
ERROR at line :
ORA-: CREATE CONTROLFILE failed
ORA-: DB_BLOCK_SIZE must be to mount this database (not )
报以上错误,再来看看datafile下面的文件,然后它把/prod/backup下面的所有的文件都包括其中了,包括控制文件的备份和lost+found文件,而这并不是数据文件,关闭数据库,删除该目录下的其它文件,将pfile move到/home/oracle下,重新执行clonedb.pl脚本
SQL> shutdown immediate
ORA-: database not mounted
ORACLE instance shut down.
SQL> quit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4. - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@node2 ~]$ cd /prod/backup/
[oracle@node2 backup]$ ls
0cq553i6_1_1
cf_D-PROD_id-289579616_0aq553hp
data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_08q553gd
data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_07q553dp
data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_09q553hj
data_D-PROD_I-289579616_TS-USERS_FNO-4_0bq553i5
lost+found
pfile.ora
[oracle@node2 backup]$ rm 0cq553i6_1_1
[oracle@node2 backup]$ rm cf_D-PROD_id-289579616_0aq553hp
[oracle@node2 backup]$ rm -rf lost+found/
[oracle@node2 backup]$ mv pfile.ora ~
[oracle@node2 backup]$ cd ~
[oracle@node2 ~]$ perl clonedb.pl pfile.ora crtdb.sql dbren.sql
重新执行crtdb.sql脚本,结果如下:
[oracle@node2 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4. Production on Mon Apr :: Copyright (c) , , Oracle. All rights reserved. Connected to an idle instance. SQL> @crtdb.sql
SQL> SET FEEDBACK
SQL> SET NUMWIDTH
SQL> SET LINESIZE
SQL> SET TRIMSPOOL ON
SQL> SET TAB OFF
SQL> SET PAGESIZE
SQL>
SQL> STARTUP NOMOUNT PFILE=/u01/app/oracle/oradata/orcl/initorcl.ora
ORACLE instance started. Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
SQL> CREATE CONTROLFILE REUSE SET DATABASE orcl RESETLOGS
MAXLOGFILES
MAXLOGMEMBERS
MAXINSTANCES
MAXLOGHISTORY
LOGFILE
GROUP '/u01/app/oracle/oradata/orcl/orcl_log1.log' SIZE 100M BLOCKSIZE ,
GROUP '/u01/app/oracle/oradata/orcl/orcl_log2.log' SIZE 100M BLOCKSIZE
DATAFILE
'/prod/backup/data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_0pq5eur7',
'/prod/backup/data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_0oq5eunu',
'/prod/backup/data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_0rq5euss',
'/prod/backup/data_D-PROD_I-289579616_TS-USERS_FNO-4_0qq5eusl'
CHARACTER SET WE8DEC; Control file created.
执行dbren.sql脚本
SQL> @dbren.sql
SQL> declare
begin
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_0pq5eur7' , '/u01/app/oracle/oradata/orcl/ora_data_orcl0.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_0oq5eunu' , '/u01/app/oracle/oradata/orcl/ora_data_orcl1.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_0rq5euss' , '/u01/app/oracle/oradata/orcl/ora_data_orcl2.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-USERS_FNO-4_0qq5eusl' , '/u01/app/oracle/oradata/orcl/ora_data_orcl3.dbf');
end;
/ PL/SQL procedure successfully completed. SQL> show errors;
No errors.
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line :
ORA-: control file or data file is from before the last RESETLOGS
ORA-: data file : '/u01/app/oracle/oradata/orcl/ora_data_orcl1.dbf' SQL> drop tablespace TEMP;
drop tablespace TEMP
*
ERROR at line :
ORA-: database not open SQL> create temporary tablespace TEMP;
create temporary tablespace TEMP
*
ERROR at line :
ORA-: database not open
下面我们来看看三个检查点:
1. 系统检查点
SQL> select checkpoint_change# from v$database; CHECKPOINT_CHANGE#
------------------ row selected.
2. 数据文件检查点
SQL> select file#,checkpoint_change#,last_change# from v$datafile;
FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
rows selected.
3. 数据文件头检查点
SQL> select CHECKPOINT_CHANGE# from v$datafile_header; CHECKPOINT_CHANGE#
------------------ rows selected.
大家发现没有?系统检查点和数据文件检查点是一致的,但数据文件头检查点是不一致的。
总结:
尝试了很多次,包括关闭数据库进行数据库冷备,数据文件头检查点和上述两个检查点的数值总是不一致,而且总是比上述检查点的数值少1,怀疑这是个bug,总之,这次实验就这样不了了之了,后续有时间的话再行测试。同时,官方文档中有一段话:
Because CloneDB databases use the backup files as their backend storage, the backup files must be available to each CloneDB database for it to run.If the backup files become unavailable, then the CloneDB databases return errors.
意思就是在运行克隆数据库的时候,备份文件必须是可用的,如果删除了备份文件或者卸载了NFS文件系统,则克隆数据库将不可用。
很好奇,可惜没有机会进行测试。
尽管该实验最后没有成功,但反复做了很多次,中间结果并不像实验步骤这样直观,有以下几点主要注意:
1> 刚开始做测试的时候,写的是/u01 *(rw),后来启用Direct NFS,创建tablespace做测试时会报以下错误:
SQL> create tablespace test datafile '/backup/prod/test.dbf' size 2m;
create tablespace test datafile '/backup/prod/test.dbf' size 2m
*
ERROR at line :
ORA-: error in creating database file '/backup/prod/test.dbf'
ORA-: unable to lock file - already in use
Linux Error: : No locks available
Additional information:
后来改为/u01 *(rw,no_root_squash)就没有报该错误,RAC文档里推荐的是/u01 *(rw,sync,no_wdelay,insecure,insecure_locks,no_root_squash)。
2> 如果采用RMAN备份的话,一定要在备份模式下,即'alter database begin backup',如果直接backup as copy database format '/backup/prod/%U',在执行
dbren.sql脚本时,会出现以下错误:
SQL> @dbren.sql
SQL> declare
begin
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-SYSAUX_FNO-2_08q553gd' , '/u01/app/oracle/oradata/orcl/ora_data_orcl0.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-SYSTEM_FNO-1_07q553dp' , '/u01/app/oracle/oradata/orcl/ora_data_orcl1.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-UNDOTBS1_FNO-3_09q553hj' , '/u01/app/oracle/oradata/orcl/ora_data_orcl2.dbf');
dbms_dnfs.clonedb_renamefile('/prod/backup/data_D-PROD_I-289579616_TS-USERS_FNO-4_0bq553i5' , '/u01/app/oracle/oradata/orcl/ora_data_orcl3.dbf');
end;
/ PL/SQL procedure successfully completed. SQL> show errors;
No errors.
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line :
ORA-: file was not restored from a sufficiently old backup
ORA-: data file : '/u01/app/oracle/oradata/orcl/ora_data_orcl1.dbf'
3> 如果数据库启用了Direct NFS,在告警日志中会有如下信息:Oracle instance running with ODM: Oracle Direct NFS ODM Library Version 3.0。
同时,可查看v$dnfs_servers视图。
SQL> select * from v$dnfs_servers; ID SVRNAME DIRNA MNTPORT NFSPORT WTMAX RTMAX
--- -------------------- ----- ---------- ---------- ---------- ------
1 node3.being.com /u01 44046 2049 32768 32768
注意:并不是启动了Direct NFS,该视图就会填充,可通过创建测试表空间来验证create tablespace test datafile '/backup/prod/test.dbf' size 2m,如果能创建成功,该视图也会被填充的。
参考文档:
1. Direct NFS (DNFS) CloneDB in Oracle Database 11g Release 2 (Patchset 11.2.0.2 onward)
2. Setup Oracle Direct NFS Client
4. Cloning a Database with CloneDB
如何利用Direct NFS克隆数据库的更多相关文章
- 使用CloneDB克隆数据库
本节包含以下主题: 关于使用CloneDB克隆数据库 使用CloneDB克隆数据库 使用CloneDB克隆数据库后 关于使用CloneDB克隆数据库 出于测试目的或其他目的克隆生产数据库通常是必要的. ...
- 利用oneproxy部署mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...
- 利用xtrabackup备份mysql数据库
利用xtrabackup备份mysql数据库 一.安装1.直接下载二进制文件wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2. ...
- 示例在同一台机器上使用RMAN克隆数据库
1.查看主库ZDJS并使用RMAM进行备份 [oracle@std ~]$ sqlplus '/as sysdba' SQL*Plus: Release - Production on Wed Jan ...
- SQLServer2005利用维护计划自动备份数据库
经常性忘了给数据库备份,结果当数据库发生问题的时候,才发现备份是1个月以前的,那个后悔与懊恼还加惭愧啊,别提有对难受了.要认为的记住去备份比较难,每天事情又那么多,所以有了这个自动备份就不用愁了.先拷 ...
- (转载)在Delphi中利用MSDASC来配置数据库链接
在Delphi中利用MSDASC来配置数据库链接 在运行期进行数据库的连接是一个问题,自己写一个窗体配置吧,数据库不一样,所用的参数也不一样,还有那讨厌的连接字符串,有时真不知该写什么好.那天无意中发 ...
- Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...
- spring+mybatis利用interceptor(plugin)兑现数据库读写分离
使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是"地位相当"的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这 ...
- 利用EntityFramework获得双色球数据库
原文 利用EntityFramework获得双色球数据库 双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买.以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往 ...
随机推荐
- 命令行解析Crash文件
做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ...
- Eclipse下Tomcat设置
1,Eclipse建立Tomcat服务 1.1 新建Server 首先这里是指,jee版的Eclipse.Eclipse是没有像MyEclipse那样集成Tomcat的,需要我们自己设置. New - ...
- wordpress搬家换域名
很多朋友开始接触wordpress都是在本地安装调试好了,再上传到服务器正常运营,我也是一样当我在本地测试好了准备将网站上线,在搬家到服务器的时候遇到过的一些问题,记录分享一下我是如何为wordpre ...
- GP调用arctoolbox 以Clip为例
GP的功能非常强大,也是GIS建模的一个很重要的工具.在Arcengine中,实现Clip功能很多种方法,可以用IBasicGeoprocessor的clip方法,但是GP无疑是最简单的. publi ...
- php中的mysql 和 mysqli 区别
mysql是非持续连接函数,每次链接都会打开一个连接进程 mysqli是持续连接函数,多次运行将使用同一连接进程,从而降低服务器开销.
- oracle 11g install linux
#!/bin/bash#Purpose:Create and config oracle install.#Usage:Log on as the superuser('root') #1.creat ...
- java HashMap那点事
集合类的整体架构 比较重要的集合类图如下: 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二 ...
- 让Entity Framework启动不再效验__MigrationHistory表
Entity Framework中DbContext首次加载OnModelCreating会检查__MigrationHistory表,作为使用Code Frist编程模式,而实际先有数据库时,这种检 ...
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.4,增加系统设置、最近联系人、群功能(源码)
自从上次版本(GG叽叽V3.2,增加离线消息.离线文件功能)发布后,我个人觉得主要的大功能都实现得差不多了,接下来的几个版本将不断优化GG的细节,提高其可用性.这次版本更新的内容主要是为GG增加了系统 ...
- ReentrantLock实现原理深入探究
前言 这篇文章被归到Java基础分类中,其实真的一点都不基础.网上写ReentrantLock的使用.ReentrantLock和synchronized的区别的文章很多,研究ReentrantLoc ...