本系列的定位是对XTTS及相关技术进行深入的学习研究。作为本系列的开篇,本着实用性的原则,我先把一次实际生产环境U2L的迁移实战实施方案进行提炼简化,旨在能清楚说明该如何使用XTTS这种解决方案来进行U2L迁移,先达到可以跟着做下来的初级目标,如果有兴趣再去深入研究相关细节。

1.XTTS概述

采用XTTS(Cross Platform Transportable Tablespaces)迁移方式,准确说这里指的是加强版XTTS,具备跨平台字节序转换、全量初始化、多次增量前滚的功能,从而有效缩短正式迁移阶段的生产停机时间,顺利完成U2L的迁移工作。比如本次需求如下:

源端 目标端
IP地址 10.6.xx.xx 10.5.xx.xx
操作系统 AIX 5.3 RHEL 6.7
是否RAC
数据库名称 sourcedb targetdb
迁移业务用户 JINGYU JINGYU

2.迁移准备阶段

2.1 校验自包含


本次只迁移 JINGYU 用户,只检查 JINGYU 用户所在表空间的自包含验证即可:

SQL> select distinct tablespace_name from dba_segments where owner='JINGYU' order by 1; 

TABLESPACE_NAME
------------------------------
DBS_D_JINGYU
DBS_I_JINGYU SQL> execute dbms_tts.transport_set_check('DBS_D_JINGYU, DBS_I_JINGYU');
PL/SQL procedure successfully completed. SQL> select * from TRANSPORT_SET_VIOLATIONS;
no rows selected

上述查询若没有结果行返回,说明自包含校验通过。

2.2 创建XTTS工作目录

本次我设置的XTTS的工作目录是/exp/newxx,在源端和目标端都创建相关目录,上传并解压MOS(文档 ID 1389592.1)提供的xttconvert脚本。

--源端AIX创建相关目录
mkdir -p /exp/newxx
mkdir -p /exp/newxx/src_backup
mkdir -p /exp/newxx/tmp
mkdir -p /exp/newxx/dump
mkdir -p /exp/newxx/backup_incre
chown -R ora103:dba /exp/newxx --源端AIX上传rman-xttconvert_2.0.zip至/exp/newxx
cd /exp/newxx
unzip rman-xttconvert_2.0.zip --目标端Linux创建相关目录
mkdir -p /exp/newxx
mkdir -p /exp/newxx/src_backup
mkdir -p /exp/newxx/tmp
mkdir -p /exp/newxx/dump
mkdir -p /exp/newxx/backup_incre
chown -R ora11g:dba /exp/newxx --目标端Linux上传rman-xttconvert_2.0.zip至/exp/newxx
cd /exp/newxx
unzip rman-xttconvert_2.0.zip

2.3 源端开启 bct

源端开启bct(block change tracking)

SQL> alter database enable block change tracking using file '/exp/newxx/bct2';
Database altered.

如果测试阶段发现bct无法生效(增量备份时间很长),可考虑手工进行一次表空间的0级备份:

--手动以level 0进行备份待迁移的表空间(只是为了增量可读bct,不做其他恢复操作)
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 16 BACKUP TYPE TO BACKUPSET;
RMAN> backup incremental level 0 tablespace DBS_D_JINGYU, DBS_I_JINGYU format '/exp/test/%U.bck';

注:这是特殊情况,不一定会遇到,根据你的实际测试情况选择是否要做。本次大概2T的表空间0级备份时间:2h。

2.4 配置 xtt.properties

配置源端AIX xtt.properties属性文件:

cd /exp/newxx
vi xtt.properties #增加如下配置信息:
tablespaces=DBS_D_JINGYU,DBS_I_JINGYU
platformid=6
dfcopydir=/exp/newxx/src_backup
backupformat=/exp/newxx/backup_incre
backupondest=/exp/newxx/backup_incre
stageondest=/exp/newxx/src_backup
storageondest=+DG_DATA/targetdb/datafile
parallel=16
rollparallel=16
getfileparallel=6

配置目标端Linux xtt.properties属性文件:

cd /exp/newxx
vi xtt.properties #增加如下配置信息:
tablespaces=DBS_D_JINGYU,DBS_I_JINGYU
platformid=6
dfcopydir=/exp/newxx/src_backup
backupformat=/exp/newxx/backup_incre
backupondest=/exp/newxx/backup_incre
stageondest=/exp/newxx/backup_incre
storageondest=+DG_DATA/targetdb/datafile
parallel=16
rollparallel=16
getfileparallel=6
asm_home=/opt/app/11.2.0/grid
asm_sid=+ASM1

注:这里的platformid=6是根据源端的OS平台决定的,可以通过查询v$database的platform_id字段进行确认,也可参照v$transportable_platform中的平台对应。

2.5 目标端提前建立用户角色

目标端创建JINGYU用户,完成元数据导入后才可修改默认表空间。

以下是在源端执行获取创建用户和对应角色、权限的语句后,在目标端对应创建(如果你很清楚要迁移业务用户的用户密码和权限等信息,也可以选择直接创建):

--源端执行:
--create user
sqlplus -S / as sysdba
set pages 0
set feedback off
spool /exp/newxx/scripts/create_user.sql
select 'create user '||name||' identified by values '''||password||''';' from user$ where name = 'JINGYU' and type#=1;
spool off
exit --create role
sqlplus -S / as sysdba
set pages 0
set feedback off
spool /exp/newxx/scripts/create_role.sql
select 'grant '||GRANTED_ROLE||' to '||grantee||';' from dba_role_privs where grantee = 'JINGYU';
spool off
exit --owner为sys的表的权限需要手动赋予
sqlplus -S / as sysdba
set pages 0
set feedback off
spool /exp/newxx/scripts/grant_sys_privs.sql
select 'grant '||PRIVILEGE||' on '||owner||'.'||table_name||' to '||GRANTEE||';' from dba_tab_privs where owner='SYS' and GRANTEE = 'JINGYU';
spool off
exit --源端验证SQL正确与否:
cat /exp/newxx/scripts/create_user.sql
cat /exp/newxx/scripts/create_role.sql
cat /exp/newxx/scripts/grant_sys_privs.sql --目标端执行:
@/exp/newxx/scripts/create_user.sql
@/exp/newxx/scripts/create_role.sql
@/exp/newxx/scripts/grant_sys_privs.sql

2.6 表空间全量备份

源端AIX执行被传输业务表空间全量备份创建xtts表空间全量备份脚本执行过程中产生的配置文件,用于数据文件转换及每次增量备份及恢复,同时每次执行增量备份过程中,配置文件内容会发生变化,用于新的增量恢复,主要是SCN的变化。

增加rman备份并行度:

RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 16 BACKUP TYPE TO BACKUPSET;

编辑备份文件,每次备份失败会在/exp/newxx/tmp产生fails文件需要删除后方可再次运行

cd /exp/newxx
--full_backup.sh脚本内容如下
export ORACLE_SID=sourcedb
export TMPDIR=/exp/newxx/tmp
export PERL5LIB=/opt/app/ora103/10.2.0/product/perl/lib
/opt/app/ora103/10.2.0/product/perl/bin/perl /exp/newxx/xttdriver.pl -p –d

在后台执行全量备份:

cd /exp/newxx
nohup sh full_backup.sh > full_backup.log &

查看/exp/newxx/src_backup产生的全量备份大小(本次测试大小为 2T,备份耗时 4小时34分钟)

2.7 表空间全量恢复及转换

将文件传输至目标端

cd /exp/newxx/src_backup
scp * ora11g@10.5.xx.xx:/exp/newxx/src_backup
--scp拷贝耗时10小时
cd /exp/newxx/tmp
scp * ora11g@10.5.xx.xx:/exp/newxx/tmp

目标端 Linux 执行表空间恢复并将数据文件转换至 ASM 磁盘组中,每次恢复失败时会在/exp/newxx/tmp 产生 fails 文件需要删除后方可再次运行(详见下面3.2节的特别说明)。

cd /exp/newxx
--full_restore.sh脚本内容如下
export TMPDIR=/exp/newxx/tmp
export ORACLE_SID=targetdb1
/opt/app/ora11g/product/11.2.0/perl/bin/perl /exp/newxx/xttdriver.pl -c –d

在后台执行全量恢复及转换:

nohup sh full_restore.sh > full_restore.log &

本次恢复及转换耗时:4 小时15分钟。

3.增量前滚阶段

**3.1 表空间增量备份**
源端进行增量备份:

cd /exp/newxx
--增量备份脚本incre_backup.sh内容如下
export ORACLE_SID=sourcedb
export TMPDIR=/exp/newxx/tmp
export PERL5LIB=/opt/app/ora103/10.2.0/product/perl/lib
/opt/app/ora103/10.2.0/product/perl/bin/perl /exp/newxx/xttdriver.pl -i –d

在后台执行增量备份:

cd /exp/newxx
nohup sh incre_backup.sh > incre_backup.log &

增量备份前确认xtt.properties文件配置正确,增量备份耗时几分钟,说明bct起作用了。

--(选做)第二次做一个测试验证表:
SQL> create table JINGYU.xttstest tablespace DBS_D_JINGYUas SELECT * FROM DBA_objects;
Select count(1) from JINGYU.xttstest;

将文件传输至目标端:

cd /exp/newxx/backup_incre
scp *_1_1 ora11g@10.5.xx.xx:/exp/newxx/backup_incre
cd /exp/newxx/tmp
scp * ora11g@10.5.xx.xx:/exp/newxx/tmp

3.2 表空间增量恢复

目标端进行增量恢复:

cd /exp/newxx
--incre_recover.sh脚本内容如下
export TMPDIR=/exp/newxx/tmp
export ORACLE_SID=targetdb1
/opt/app/ora11g/product/11.2.0/perl/bin/perl /exp/newxx/xttdriver.pl -r –d

在后台执行增量恢复:

nohup sh incre_recover.sh > incre_recover.log &

特别说明:

1.以上增量前滚的步骤在正式迁移前可重复执行多次,用于对目标库进行多次表空间增量恢复,使目标端数据库在正式迁移前与生产数据库近乎一致,大幅减少迁移停机时间。

2.每次备份(全量和增量)成功后,源端/exp/newxx/tmp目录中会生成文件,需要将此目录下的所有文件传输到/exp/newxx/tmp下(每次覆盖即可)

3.每次备份(全量和增量)后,/exp/newxx/tmp目录中会生成最新的xttplan.txt.new文件,该文件中记录了各表空间最新的scn,需要将旧的xttplan.txt文件在每次增量恢复前linux端进行如下改名操作:

cd /exp/newxx/tmp

mv xttplan.txt xttplan.old1.txt

mv xttplan.txt.new xttplan.txt

4.正式迁移阶段

**4.1 表空间read only**
应用侧停止业务后,数据库层面复查确认没有用户会话连接;
源端AIX将被传输业务表空间修改为READ ONLY状态:

sqlplus -S / as sysdba
set pages 0
set feedback off
spool /exp/newxx/scripts/read_only.sql
select 'alter tablespace '||name||' read only;' from v$tablespace where name in ('DBS_D_JINGYU','DBS_I_JINGYU') order by 1;
spool off
exit cat /exp/newxx/scripts/read_only.sql
@/exp/newxx/scripts/read_only.sql

4.2 最后一次增量操作

按照前面 增量前滚阶段的方法,完成最后一次增量备份与恢复。

本次测试,最后一次增量备份时间用时 21 分钟。

4.3 目标端开启闪回

目标端Linux开启在导入元数据前开启闪回

SQL> alter system set db_recovery_file_dest_size=100g scope=both;
System altered. SQL> alter system set db_recovery_file_dest='+DG_DATA' scope=both;
System altered. SQL> alter database flashback on;
Database altered. SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES SQL> create restore point before_imp_xtts guarantee flashback database;
Restore point created. SQL> select name from v$restore_point;
确认有刚建立的restore point。

4.4 导入XTTS元数据

4.4.1 AIX源端导出XTTS元数据:

create directory dump as '/exp/newxx/dump';

导出表空间、用户元数据:

--导出表空间元数据(vi expdp_xtts.sh)
expdp system/oracle parfile=expdp_xtts.par
--expdp_xtts.par内容如下:
directory=dump
dumpfile=tbs_xtts.dmp
logfile=expdp_xtts.log
transport_tablespaces=('DBS_D_JINGYU','DBS_I_JINGYU')
transport_full_check=y
metrics=yes --导出用户元数据(vi expdp_xtts_other.sh)
expdp system/oracle parfile=expdp_xtts_other.par
--expdp_xtts_other.par内容如下
directory=dump
dumpfile=tbs_xtts_other.dmp
logfile=expdp_xtts_other.log
content=metadata_only
schemas=JINGYU
metrics=yes

执行导出表空间、用户元数据的脚本:

cd /exp/newxx/dump
./expdp_xtts.sh
./expdp_xtts_other.sh

导出完成后将dump文件传输到目标端/exp/newxx/dump目录

cd /exp/newxx/dump
scp *.dmp ora11g@10.5.xx.xx:/exp/newxx/dump

4.4.2 LINUX目标端导入XTTS元数据:

创建directory:

create or replace directory dump as '/exp/newxx/dump';

导入XTTS元数据:

--导入XTTS元数据(vi impdp_xtts.sh)
impdp system/oracle parfile=impdp_xtts.par
--impdp_xtts.par内容如下:
directory=dump
logfile=impdp_xtts.log
dumpfile=tbs_xtts.dmp
cluster=n
metrics=yes
transport_datafiles='+DG_DATA/targetdb/DATAFILE/DBS_D_JINGYU.290.976290433',
'+DG_DATA/targetdb/DATAFILE/DBS_I_JINGYU.286.976290433'

注意:上面数据文件路径需要根据实际导入情况更改。

执行导入XTTS元数据的脚本:

cd /exp/newxx/dump
./impdp_xtts.sh
SQL> select count(1) from JINGYU.xttstest;
正常返回结果.

执行完成后,同时验证成功。

4.5 表空间read write

LINUX目标端表空间read write:

sqlplus -S / as sysdba
set pages 0
set feedback off
spool /exp/newxx/scripts/read_write.sql
select 'alter tablespace '||name||' read write;' from v$tablespace where name in ('DBS_D_JINGYU','DBS_I_JINGYU') order by 1;
spool off
exit cat /exp/newxx/scripts/read_write.sql
@/exp/newxx/scripts/read_write.sql

4.6 第二次开启闪回

目标端Linux在其他元数据导入前再次开启闪回

sqlplus / as sysdba
select flashback_on from v$database;
create restore point before_imp_other guarantee flashback database;
select name from v$restore_point;

4.7 导入其他元数据

导入其他元数据

--导入其他元数据(vi impdp_xtts_other.sh)
impdp system/oracle parfile=impdp_xtts_other.par
--impdp_xtts_other.par 内容如下
directory=dump
dumpfile=tbs_xtts_other.dmp
logfile=impdp_xtts_other.log
content=metadata_only
schemas=JINGYU
cluster=n
metrics=yes

执行导入其他元数据的脚本:

cd /exp/newxx/dump
./impdp_xtts_other.sh

4.8 检查public dblink

原生产环境查询public dblink,若有结果,到新生产环境创建:

--原生产环境查询:
select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
------------------------------ ------------------------------ ------------------------------ ------------------------------ -------------------
JINGYU XXX_TMP JINGYU xxdb 2008-05-20 09:51:14 select dbms_metadata.get_ddl('DB_LINK',DB_LINK,'JINGYU') FROM DBA_DB_LINKS where owner='JINGYU'; CREATE DATABASE LINK "XXX_TMP"
CONNECT TO "JINGYU" IDENTIFIED BY VALUES '056414CFC01C4F42E2E496B913FDC0212A'
USING 'xxdb'; --连接到JINGYU用户创建即可,开始没有权限:
grant create database link to JINGYU;

4.9 检查public synonyms

原生产环境查询public synonyms,若有结果,到新生产环境创建:

select owner,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME from dba_synonyms where owner='PUBLIC' and table_owner in ('JINGYU');

本次无结果。

4.10 检查外部表

原生产环境查询外部表信息,若有结果,到新生产环境创建:

SQL> select * from dba_external_tables;

本次无结果。

4.11 数据比对

源环境和目标环境分别查询比对:

set linesize 200
set pagesize 9999
col owner format a15
col object_type format a15
select owner, object_type, count(*)
from dba_objects
where object_name not like 'BIN%'
and owner in ('JINGYU')
group by owner, object_type
order by 1,2 desc; OWNER OBJECT_TYPE COUNT(*)
--------------- --------------- ----------
JINGYU VIEW 2
JINGYU TABLE PARTITION 25
JINGYU TABLE 49
JINGYU SEQUENCE 4
JINGYU PROCEDURE 5
JINGYU INDEX PARTITION 225
JINGYU INDEX 55
JINGYU FUNCTION 3
JINGYU DATABASE LINK 1 9 rows selected.

4.12 编译失效对象

查询失效对象数量,按对象类型分组统计:

sqlplus / as sysdba
set timing on
select owner, object_type, count(*)
from dba_objects
where status <> 'VALID'
and owner in ('JINGYU')
group by owner, object_type
order by 1, 2 desc; OWNER OBJECT_TYPE COUNT(*)
--------------- --------------- ----------
JINGYU PROCEDURE 1
JINGYU FUNCTION 1 --查看具体失效对象,比对源端、目标端:
set linesize 200
set pagesize 9999
col owner format a15
col object_type format a15
col OBJECT_NAME for a32
select owner,object_name, object_type, status
from dba_objects
where status <> 'VALID'
and owner in ('JINGYU') order by 2; OWNER OBJECT_NAME OBJECT_TYPE STATUS
--------------- -------------------------------- --------------- -------
JINGYU XXXXCITY FUNCTION INVALID
JINGYU TAB_MAINTAIN_XXX PROCEDURE INVALID 编译失效对象(若两边失效对象一致可不做)
exec utl_recomp.recomp_parallel(64);

4.13 更改用户默认表空间

由于表空间比用户晚创建,需要手动更改默认表空间:

alter user JINGYU default tablespace DBS_D_JINGYU;
select username,default_tablespace,temporary_tablespace from dba_users where username='JINGYU';

4.14 删除闪回点


确认本次迁移成功后,手动删除闪回点

--(选做)此时可以先删除之前的测试表:
drop table JINGYU.xttstest; --手动删除闪回点:
drop restore point BEFORE_IMP_XTTS;
drop restore point before_imp_other;
select name from v$restore_point; --关闭闪回数据库的功能:
SQL> alter database flashback off; Database altered. SQL> select flashback_on from v$database; FLASHBACK_ON
------------------
NO SQL> alter system set db_recovery_file_dest='' sid='*' scope=both; System altered.

4.15 修改service参数

手动修改和用户同名的service参数:

--service_names参数保持和源端一致:
show parameter service_names
alter system set service_names ='dbaas','targetdb','jingyursv', 'jingyu' sid='*' scope=both;
alter system register;

检查监听注册情况:

--本次环境使用的非默认监听,名字是targetdb:
lsnrctl status targetdb

5.其他注意事项

收集了公司同事在其他项目实际进行XTTS迁移项目的经验,再结合本次自己实施过程中遇到的情况,列举了XTTS相关的其他注意事项(欢迎大家继续补充自己做XTTS时踩过的坑和对应的经验分享):
- 1.使用XTTS迁移所需时间根据情况不同所花费时间也不同,每次都需要评估好停机时间;
- 2.XTTS迁移速度主要在于元数据的导出导入时间(无法使用并行),对象数越多导入导出越慢;
- 3.导入过程中检查是否有其他用户建在导出用户表空间上的索引,此种索引无法在自包含检查中检测出来,所以应在全量备份前进行检查。提前处理此种对象,我这次没有遇到:

  /*查询表空间中对象的详细信息*/
SELECT OWNER AS OWNER
,SEGMENT_NAME AS SEGMENT_NAME
,SEGMENT_TYPE AS SEGMENT_TYPE
,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME in ('DBS_D_JINGYU','DBS_I_JINGYU') and owner <> 'JINGYU'
GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE
ORDER BY 4;
  • 4.使用XTTS迁移数据库必须每套数据库都进行测试,并生成细致操作文档(由于每个数据库每个用户对象之间的关联关系不同,再倒入元数据的时候相互依赖关系可能比较难梳理。必须提前做测试进行梳理);
  • 5.XTTS目标端必须有11.2.0.4的软件进行数据文件转换,源端最低为10G数据库;
  • 6.XTTS在目标端做全量以及增量恢复时,会重启运行恢复脚本的实例(如果目标端数据库还有其他业务用户属于生产运行,尤其要注意这点);
  • 7.本次测试遇到因源库数据文件名称包含特殊字符导致表空间全量备份缺失文件且日志不报任何错误,在恢复阶段才发现缺少文件,所以建议以后准备工作多加一项数据文件数量的检查比对:
  select count(1) from dba_data_files where tablespace_name in ('DBS_D_JINGYU','DBS_I_JINGYU');
--本次迁移数据文件数量135,与表空间全量备份出来的文件数量进行对比确认一致。

关于第7项,我实际遇到并在测试环境进行了重现,具体可参考之前的随笔:

XTTS系列之一:U2L迁移解决方案之XTTS的使用的更多相关文章

  1. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  2. HDFS数据迁移解决方案之DistCp工具的巧妙使用

    前言 在当今每日信息量巨大的社会中,源源不断的数据需要被安全的存储.等到数据的规模越来越大的时候,也许瓶颈就来了,没有存储空间了.这时候怎么办,你也许会说,加机器解决,显然这是一个很简单直接但是又显得 ...

  3. #进阶系列——WebApi 身份认证解决方案:Basic基础认证

    阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...

  4. Code First开发系列之数据库迁移

    返回<8天掌握EF的Code First开发>总目录 本篇目录 开启并运行迁移 使用迁移API 应用迁移 给已存在的数据库添加迁移 EF的其他功能 本章小结 自我测试 本系列的源码本人已托 ...

  5. C#进阶系列——WebApi身份认证解决方案:Basic基础认证 (转)

    http://www.cnblogs.com/landeanfen/p/5287064.html 前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人 ...

  6. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. JS组件系列——Bootstrap右键菜单解决方案:ContextMenu

    前言:有段时间没发表随笔了,过个年人都变得懒了.新年刚来上班,今天正好得空,将去年遗留的两个小组件总结记录下.有朋友跟我说:你的bootstrap组件要能够形成一个可以满足一般项目需求的系列组件,才有 ...

  8. SharePoint 数据迁移解决方案

    前言:说来惭愧,我们的SharePoint内网门户跑了2年,不堪重负,数据量也不是很大,库有60GB左右,数据量几万条,总之由于各种原因吧,网站速度非常慢,具体问题研究了很久,也无从解决,所有考虑用N ...

  9. oracle 数据库数据迁移解决方案

    大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,接下来把心得与大家分享一下   去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁 ...

随机推荐

  1. HTML连载9-video标签的第二种格式&audio标签

    一.video第二种格式 1.背景:由于视频数据非常重要,所以五大浏览器厂商都不愿意支持别人的视频格式,所以导致了没有一种视频格式是所有浏览器都支持的.这个时候W3C为了解决这个问题,所以推出了第二种 ...

  2. Linux下Flume的安装部署

    一.前置条件 Flume需要依赖JDK 1.8+,JDK安装方式见本仓库: Linux环境下JDK安装 二 .安装步骤 2.1 下载并解压 下载所需版本的Flume,这里我下载的是CDH版本的Flum ...

  3. spring 5.x 系列第1篇 —— springmvc基础 (xml配置方式)

    文章目录 一.搭建hello spring工程 1.1 项目搭建 1.2 相关配置讲解 二.配置自定义拦截器 三.全局异常处理 四.参数绑定 4.1 参数绑定 4.2 关于日期格式转换的三种方法 五. ...

  4. C语言实现贪吃蛇

    日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组   结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...

  5. Mac上使用brew update会卡住的问题

    Mac上使用brew update会卡住的问题 brew默认的源是Github,会非常慢,建议换为国内的源.推荐中科大的镜像源,比较全面. 解决方案 Homebrew Homebrew源代码仓库 替换 ...

  6. C# Redis分布式锁(基于ServiceStack.Redis)

    相关的文章其实不少,我也从中受益不少,但是还是想自己梳理一下,毕竟自己写的更走心! 首先给出一个拓展类,通过拓展方法实现加锁和解锁. 注:之所以增加拓展方法,是因为合理使用拓展类(方法),可以让程序更 ...

  7. leadcode的Hot100系列--226. 翻转二叉树

    这玩意儿基本上还是遍历的那一套, 这里使用先序遍历的方式,直接对左右子树进行对调即可. (虽然看题目的时候,感觉都一样,但真正写出来之后,印象还是深刻了很多) struct TreeNode* inv ...

  8. Easy doesn't enter into grown-up life

    Hi xinlu, good afternoon, my name is xx, you can also call me andrew. i'm 31 years old, and i'm from ...

  9. Yii basic 模板支持连接多数据库

    1.首先修改db配置文件,修改格式如下: return [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:hos ...

  10. 走近Java之HashMap In JDK8

    HashMap,继承AbstractMap类,实现了Map接口,特性是无序不可重复,其本身的数据结构是数组加链表和红黑树.今天我们就一起来详细了解一下. 首先,需要知道,HashMap中几个关键词的含 ...