高性能 Socket 组件 HP-Socket v3.1.3 正式发布

DuMiYue 2014-03-31 10:22:27
加精

  HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装,上层应用不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到各类应用程序中;另外,为了让大家能更方便的学习 HP-Socket,特此精心制作了一个功能测试示例(Test Echo)一个性能测试示例(Test Echo-PFM)和一个 PULL 模型测试示例(Test Echo-Pull),用户可以通过这两个测试示例入手,迅速掌握组件的设计思想和使用方法。

* HP-Socket 官方网站:http://www.jessma.org
* HP-Socket 下载地址:http://www.oschina.net/p/hp-socket
------------------------------------------------------------------------------------------------
通用性
  通信组件的唯一职责就是接受和发送字节流,绝对不能参与上层协议解析等工作;
与上层使用者解耦、互不依赖,组件与使用者通过操作接口和监听器接口进行交互,组件实现操作接口为上层提供操作方法;使用者实现监听器接口把自己注册为组件的 Listener,接收组件通知。因此,任何使用者只要实现了监听器接口都可以使用组件;另一方面,甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用,只要该组件遵从组件的操作接口,这也是 DIP 设计原则的体现。

可用性
  可用性对所有通用组件都是至关重要的,如果太难用还不如自己重头写一个来得方便。因此,组件的操作接口和监听器接口设计得尽量简单易用(通俗来说就是“傻瓜化”),这两个接口的主要方法均不超过 5 个。另外,组件完全封装了所有的底层 Socket 通信,上层应用看不到任何通信细节,不必也不能干预任何通信操作,Socket 连接被抽象为 Connection ID,该参数作为连接标识提供给上层应用识别不同的连接。

高性能
  作为底层的通用组件,性能问题是必须考虑的,绝对不能成为系统的瓶颈。而另一方面,从实际出发,根据客户端组件与服务端组件的性能要求采用不同的 Socket 模型。组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素,确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策:
  客户端:在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰;I/O 模型选择 Event Select 通信模型。
  服务端:采用 Windows 平台效率最高的 IOCP 通信模型;利用缓存池技术,在通信的过程中,通常需要频繁的申请和释放内存缓冲区,建立了动态缓存池, 只有当缓存池中没有可用对象时才创建新对象,而当缓存对象过多时则会压缩缓存池;另外,组件的动态内存通过私有堆(Private Heap)机制分配,避免与 new / malloc 竞争同时又减少内存空洞。

伸缩性
  可以根据实际的使用环境要求设置组件的各项性能参数(如:工作线程的数量、各种缓存池的大小、收发缓冲区的大小、Socket 监听队列的大小、Accep 派发的数目以及心跳检查的间隔等)。
------------------------------------------------------------------------------------------------

*** v3.1.3 更新 ***

> 增加其它语言 Demo:
-----------------
1、C#
2、Delphi
3、E 语言

> Bug Fix:
-----------------
1、修复 IP 地址判断错误 Bug
1) 客户端组件连接服务器时,如果服务器 IP 地址满位(12个数字:‘AAA.BBB.CCC.DDD’)则被错误地判断为域名
2) 影响组件:所有 TCP/UDP 客户端组件
3) 影响版本:v3.1.2 及之前所有版本
2、 修复域名或主机名的 IP 地址解析错误 Bug
1) 客户端组件通过域名或主机名连接服务器时,可能会解析到错误的 IP 地址
2) 影响组件:所有 TCP/UDP 客户端组件
3) 影响版本:v3.1.2 及之前所有版本

> 升级说明:
-----------------
1、使用 HP-Socket v3.1.2 及以前版本的应用程序可以安全升级到 HP-Socket v3.1.3
------------------------------------------------------------------------------------------------

*** v3.1.2 更新 ***

> 修改 Server 组件的 OnClose() / OnError() 事件的触发规则:
-----------------
1、以前版本的 TCP/UDP Server 组件中,当关闭一个连接时可能会同时触发一个 OnClose() 事件和若干个 OnError() 事件
2、由于存在上述可能性,所以应用程序需要对 OnClose() / OnError() 的处理事件代码段进行同步
3、从 v3.1.2 开始,多个 OnClose() / OnError() 事件同时发生时,组件只会向应用通知第一个事件,后续事件则忽略
4、应用程序在处理 OnClose() / OnError() 事件时不必处理同步,减少了出错的可能和编写同步及检测代码的负担

/* 示例代码一:*/
/* ----------------------------------------------------------------------- */
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{
// 以前版本:
// 有可能存在并发的 OnClose()/OnError(),要把代码放在临界区中并检测返回值
CCriSecLock locallock(m_csPkgInfo); // <-- 临界区

PVOID pInfo = nullptr;
// <-- 检测返回值
if(m_Server->GetConnectionExtra(dwConnID, &pInfo) && pInfo != nullptr)
{
m_Server->SetConnectionExtra(dwConnID, nullptr);
delete pInfo;
}
}

/* 示例代码二:*/
/* ----------------------------------------------------------------------- */
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{
// v3.1.2 版本:
// 只会接收到一个 OnClose()/OnError() 事件,能安全地移除临界区代码和检测代码

PVOID pInfo = nullptr;
m_Server->GetConnectionExtra(dwConnID, &pInfo);
ASSERT(pInfo != nullptr);

delete pInfo;
}

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

*** v3.1.1 更新 ***

> 增加导出纯 C 函数的动态链接库 HPSocket4C.dll:
-----------------
1、增加代码文件 HPSocket4C.h 和 HPSocket4C.cpp,用于创建 HPSocket4C.dll
2、导出纯 C 函数,让其它语言(如:C/C#/Delphi 等)能方便地使用 HPSocket
3、HPSocket4C.dll 使用方法

方法一:
----------------------------------------------------------------------------
(0) (C/C++ 程序)包含 HPSocket4C.h 头文件
(1) 调用 ::Create_HP_XxxListener() 函数创建监听器对象
(2) 调用 ::Create_HP_Xxx(pListener) 函数创建 HPSocket 对象
(3) 调用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函数设置监听器的回调函数
(4) 调用相关导出函数操作 HPSocket 对象
(5) ...... ......
(6) 调用 ::Destroy_HP_Xxx(pSocket) 函数销毁 HPSocket 对象
(7) 调用 ::Destroy_HP_XxxListener(pListener) 函数销毁监听器对象

方法二:
----------------------------------------------------------------------------
(1) 应用程序把需要用到的导出函数封装到特定语言的包装类中
(2) 通过包装类封装后,以面向对象的方式使用 HPSocket
4、HPSocket4C.dll 动态链接库发行版本

(1) x86/HPSocket4C.dll - (32位/MBCS/Release)
(2) x86/HPSocket4C_D.dll - (32位/MBCS/DeBug)
(3) x86/HPSocket4C_U.dll - (32位/UNICODE/Release)
(4) x86/HPSocket4C_UD.dll - (32位/UNICODE/DeBug)
(5) x64/HPSocket4C.dll - (64位/MBCS/Release)
(6) x64/HPSocket4C_D.dll - (64位/MBCS/DeBug)
(7) x64/HPSocket4C_U.dll - (64位/UNICODE/Release)
(8) x64/HPSocket4C_UD.dll - (64位/UNICODE/DeBug)

> 全面启用 Buffer Pool 缓存机制:
-----------------
1、Common/Src 增加代码文件 bufferpool.h 和 bufferpool.cpp,实现 Buffer Pool 缓存机制
2、通过 Buffer Pool 缓存机制提升内存使用效率,减少动态内存分配和释放操作,避免内存空洞
3、CTcpClient 用 CItemPool 和 TItemList 实现发送缓冲区
4、CUdpClient 用 CItemPool 和 TItemList 实现发送缓冲区
5、CTcpPullClient 用 CItemPool 和 TItemList 实现发送缓冲区和 PULL 缓冲区
6、CTcpPullServer 用 CBufferPool 和 TBuffer 实现 PULL 缓冲区
------------------------------------------------------------------------------------------------

*** v3.0.2 更新 ***

> 把 HP-Socket 编译为动态链接库:
-----------------
1、应用程序可以通过导入源代码或动态链接库方式使用 HP-Socket
2、动态链接库使用方法

方法一:
-----------------------------------------------------------------------
(0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
(1) 调用 HP_Create_Xxx() 函数创建 HPSocket 对象
(2) 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象

方法二:
-----------------------------------------------------------------------
(0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
(1) 创建 CXxxWrapper 包装器,通过包装器智能指针使用 HPSocket 对象
3、动态链接库发行版本

(1) Bin/x86/HPSocket.dll - (32位/MBCS/Release)
(2) Bin/x86/HPSocket_D.dll - (32位/MBCS/DeBug)
(3) Bin/x86/HPSocket_U.dll - (32位/UNICODE/Release)
(4) Bin/x86/HPSocket_UD.dll - (32位/UNICODE/DeBug)
(5) Bin/x64/HPSocket.dll - (64位/MBCS/Release)
(6) Bin/x64/HPSocket_D.dll - (64位/MBCS/DeBug)
(7) Bin/x64/HPSocket_U.dll - (64位/UNICODE/Release)
(8) Bin/x64/HPSocket_UD.dll - (64位/UNICODE/DeBug)

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

*** v3.0.1 更新 ***

> 新增 UDP 通信组件:
-----------------
1、新增两个 UDP 通信组件:CUdpServer 为服务端组件,CUdpClient 为客户端组件
2、服务端组件 CUdpServer 采用 IOCP 通信模型
3、客户端组件 CUdpClient 采用 Event Select 通信模型
4、UDP 通信组件的接口与原 TCP 通信组件一致,简单实用
5、UDP 通信组件内置通信线路自动监测机制
6、新增 UDP 通信组件示例工程 TestEcho-UDP

> 代码重构与优化:
-----------------
1、规范所有接口、类以及代码文件的命名
2、重构和优化了大量组件代码
3、服务端组件加入读写锁机制,有效平衡处理性能与安全性
4、服务端组件的 Socket 对象缓存列表设置了锁定时间,提高访问的安全性
------------------------------------------------------------------------------------------------

*** v2.2.3 更新 ***

> 连接 ID 的数据类型改为‘CONNID’:
-----------------
1、在SocketHelper.h 中定义 CONNID 数据类型(默认:typedef ULONG_PTR CONNID)
2、应用程序可以把 CONNID 定义为其希望的类型(如:ULONG / ULONGLONG 等)
3、为了便于移植与维护,应用程序的任何地方都应该用‘CONNID’类型引用连接 ID

> 服务端 Socket 组件支持为每个连接绑定附加数据:
-----------------
1、IServerSocket 和 CIocpServer 增加方法 Get/SetConnectionExtra()
2、通过上述两个方法,应用程序可以为每个连接绑定任意附加数据并把数据获取出来
------------------------------------------------------------------------------------------------

*** v2.2.2 更新 ***

> 优化心跳检测相关功能:
-----------------
1、IServerSocket 和 IClientSocket 的 Get/SetKeepAliveTimes() 方法改为 Get/SetKeepAliveTime()
2、CIocpServer 和 CClientSocket 的默认 KeepAliveTime 属性改为 5000
3、CIocpServer 和 CClientSocket 的默认 KeepAliveInterval 属性改为 3000
------------------------------------------------------------------------------------------------

*** v2.2.1 更新 ***

> PULL 模型支持:
-----------------
1、ISocketListener 增加 PULL 模型数据接收通知方法 OnReceive(dwConnID, int)
2、增加 PULL Socket 接口 IPullSocket,该接口的 Fetch(dwConnID, pBuffer, iLength) 方法用于抓取通信数据

> Server:
-----------------
1、服务端 Socket 接口 ISocketServer 改名为 IServerSocket
2、增加 PULL Server Socket 监听器抽象类 CPullServerSocketListener
3、增加 PULL Server Socket 接口 IPullServerSocket
4、增加 PULL Server Socket 实现类 CIocpPullServer

> Client:
-----------------
1、客户端 Socket 接口 ISocketClient 改名为 IClientSocket
2、客户端 Socket 实现类 CSocketClient 改名为 CClientSocket
3、增加 PULL Client Socket 监听器抽象类 CPullClientSocketListener
4、增加 PULL Client Socket 接口 IPullClientSocket
5、增加 PULL Client Socket 实现类 CPullClientSocket
...全文
2221 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤飞俊驰 2014-10-13
  • 打赏
  • 举报
回复
可以私下交流一些问题吗?我QQ445013639
孤飞俊驰 2014-10-13
  • 打赏
  • 举报
回复
我看了下你的代码,我有几点疑问,如何处理连续收包的问题, 如一个5K的文件,客户端每次只发1K到服务端, 服务器连续接受5次(当然,协议里面有总包数和包序号),接受完成之后工作线程才处理数据,请问我上层怎么调用你的函数?
teaccc2000 2014-04-19
  • 打赏
  • 举报
回复
用到了,在一个winform 程序中用到了,,还在测试中,服务器同时连接数在2到5个左右,每次传递的数据在20-30个字节左右,挺稳定的。谢谢先。
DuMiYue 2014-04-15
  • 打赏
  • 举报
回复
引用 51 楼 teaccc 的回复:
关注,正在找类似的程序,谢谢先。
用起来了没有呢?~
DuMiYue 2014-04-15
  • 打赏
  • 举报
回复
引用 62 楼 gufeijunchi 的回复:
[quote=引用 60 楼 DuMiYue 的回复:] [quote=引用 35 楼 gufeijunchi 的回复:] 过来关注一下,没用到楼主的组件,但是用到了IOCP模型。
haha, 可以考虑换了~[/quote] 在下了看,对了你的VC-Logger 功能有没有log4cxx强大?[/quote] 何谓强大~?如果指性能的话你下来测试比较一下~
孤飞俊驰 2014-04-15
  • 打赏
  • 举报
回复
引用 60 楼 DuMiYue 的回复:
[quote=引用 35 楼 gufeijunchi 的回复:] 过来关注一下,没用到楼主的组件,但是用到了IOCP模型。
haha, 可以考虑换了~[/quote] 在下了看,对了你的VC-Logger 功能有没有log4cxx强大?
DuMiYue 2014-04-11
  • 打赏
  • 举报
回复
引用 35 楼 gufeijunchi 的回复:
过来关注一下,没用到楼主的组件,但是用到了IOCP模型。
haha, 可以考虑换了~
DuMiYue 2014-04-10
  • 打赏
  • 举报
回复
引用 56 楼 DuMiYue 的回复:
[quote=引用 54 楼 oldmtn 的回复:] 经过本人又一次研究,自己回答了自己的问题。 你在HPSocket.h里面给出的方法是: 方法一: -------------------------------------------------------------------------------------- 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象 这是常规调用DLL的用法。 但是你的Sample-TestEcho里面却将Common文件夹以及CTcpServer这个类直接包含了进来,因此可以直接调用类,而不需要指针。 啊呀,,,,,,。。 也许也是为了方便吧。。。
HPSocket提供3种使用方式: 1、源代码方式:不解释,例子 TestEcho、TestEcho-UDP 2、C++ DLL 方式:C++程序通过 HPSocket.dll使用 HP-Socket,对C++程序来说是首选 3、C DLL方式:其他语言程序通过 HPSocket4C.dll使用 HP-Socket,对C++程序来说不是首选[/quote] 1、源代码方式:TestEcho、TestEcho-UDP 2、C++ DLL 方式:TestEcho-PFM、TestEcho-Pull 3、C DLL方式:TestEcho-4
DuMiYue 2014-04-10
  • 打赏
  • 举报
回复
引用 54 楼 oldmtn 的回复:
经过本人又一次研究,自己回答了自己的问题。 你在HPSocket.h里面给出的方法是: 方法一: -------------------------------------------------------------------------------------- 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象 这是常规调用DLL的用法。 但是你的Sample-TestEcho里面却将Common文件夹以及CTcpServer这个类直接包含了进来,因此可以直接调用类,而不需要指针。 啊呀,,,,,,。。 也许也是为了方便吧。。。
HPSocket提供3种使用方式: 1、源代码方式:不解释,例子 TestEcho、TestEcho-UDP 2、C++ DLL 方式:C++程序通过 HPSocket.dll使用 HP-Socket,对C++程序来说是首选 3、C DLL方式:其他语言程序通过 HPSocket4C.dll使用 HP-Socket,对C++程序来说不是首选
DuMiYue 2014-04-10
  • 打赏
  • 举报
回复
引用 58 楼 oldmtn 的回复:
TO LZ: 我看了你的CUdpClient后,想提点意见。昨天本想发的,结果三连,发不了。 你的UdpClient也同样要进行connect,然后再send发送。 而很多时候udp需要直接调用sendto向不同的地址发送数据。 你要是能把sendto也实现了就好了。。 一点小意见。。。
这个 UDP 组件应用于 C/S 模式的场合,不处理随意发送的情形,这种情形其实不多,需要的话可以用Client+Server组合来实现。
oldmtn 2014-04-10
  • 打赏
  • 举报
回复
TO LZ: 我看了你的CUdpClient后,想提点意见。昨天本想发的,结果三连,发不了。 你的UdpClient也同样要进行connect,然后再send发送。 而很多时候udp需要直接调用sendto向不同的地址发送数据。 你要是能把sendto也实现了就好了。。 一点小意见。。。
DuMiYue 2014-04-09
  • 打赏
  • 举报
回复
引用 50 楼 oldmtn 的回复:
另外,你的例子为什么不在 Server中加上send这个功能呢???
1、Apache 2.0 开源协议,随便你怎么用,只需要源文件保留 License 描述。 2、例子是 Echo,当然有 Send 功能了。
oldmtn 2014-04-09
  • 打赏
  • 举报
回复
引用 52 楼 DuMiYue 的回复:
[quote=引用 50 楼 oldmtn 的回复:] 另外,你的例子为什么不在 Server中加上send这个功能呢???
1、Apache 2.0 开源协议,随便你怎么用,只需要源文件保留 License 描述。 2、例子是 Echo,当然有 Send 功能了。 [/quote] 但是你的Server没有主动点击按钮再发送指定字符串。不过我仔细看后,已经解决了。。。 tks.
oldmtn 2014-04-09
  • 打赏
  • 举报
回复
经过本人又一次研究,自己回答了自己的问题。 你在HPSocket.h里面给出的方法是: 方法一: -------------------------------------------------------------------------------------- 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象 这是常规调用DLL的用法。 但是你的Sample-TestEcho里面却将Common文件夹以及CTcpServer这个类直接包含了进来,因此可以直接调用类,而不需要指针。 啊呀,,,,,,。。 也许也是为了方便吧。。。
oldmtn 2014-04-09
  • 打赏
  • 举报
回复
引用 52 楼 DuMiYue 的回复:
[quote=引用 50 楼 oldmtn 的回复:] 另外,你的例子为什么不在 Server中加上send这个功能呢???
1、Apache 2.0 开源协议,随便你怎么用,只需要源文件保留 License 描述。 2、例子是 Echo,当然有 Send 功能了。 [/quote] 方法一: -------------------------------------------------------------------------------------- 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象 这是你提供的方法? 但是你给出的TestEcho等例子中并没有这样做却也调用成功了,为什么???
caewow 2014-04-08
  • 打赏
  • 举报
回复
好东西啊,谢谢楼主分享!
oldmtn 2014-04-08
  • 打赏
  • 举报
回复
可以商业使用而不通知LZ。 可以吗??
teaccc2000 2014-04-08
  • 打赏
  • 举报
回复
关注,正在找类似的程序,谢谢先。
oldmtn 2014-04-08
  • 打赏
  • 举报
回复
另外,你的例子为什么不在 Server中加上send这个功能呢???
austin9972 2014-04-07
  • 打赏
  • 举报
回复
加载更多回复(45)
本系列课程分为,0-理论知识部分    0.1-oca_ocp_ocm相关知识内容(uploading)1-安装部分     1.1单实例命令行安装     1.2单实例图形安装     1.3rac安装     1.4rac(pdb架构)+dg 单实例安装(用rman的duplicate和rman备份2种方式搭建dg)     1.5rac(pdb架构)+rac dg2-迁移部分    2.1单实例之间的迁移    2.2单实迁移到rac    2.3rac迁移到单实例    2.4rac和rac之间的迁移。    2.5关于xtts的迁移方法的使用3-恢复部分   3.1单实例本地恢复   3.2rac本地恢复4-数据库升级部分   4.1 19.3升级到19.13   4.2 12.1.0.2升级到19.3   4.3 12.2.0.1升级到19.3   4.4 19.3的rac升级到19.135-数据库优化部分    5.1如何看懂执行计划    5.2 hash, nest loop,  merge的执行计划各自适用于那种场景?    5.3为什么要用直方图,19c的直方图有frency, balance,  top-frenkency, hybrid?允许最大的bucket是多少?6-数据库asm磁盘操作部分   6-1如何用一条命令迁移rac存储。   6-2如何用笨方法迁移rac存储。   6-3目前asm磁盘是external冗余级别,如何修改为normal的冗余级别。7-数据库工具部分   7.1oem如何进行安装,如何进行纳管数据库,如何使用   7.2如何用oem监控数据库 8-综合实战。   a库是11.2.0.3的单实例数据库,容量有20T。   b库是19.13的rac环境的pdb数据库,容量只有21T.   如何把a库的数据迁移到b库的pdb数据库?   这个综合实战非常考验大家,基本上囊括了数据库复制安装,数据库dg,数据库升级的方方面面。   大家可以自己先想想怎么实现。一课程主题手把手带大家进行实操,在实操中提升自己手把手带大家学习orace 19的ocm课程,学完本课程,至少具有3-5年oracle数据库水平。文档和视频is uploading. 二课程特色 学oracle,找阿伟阿伟出品,必属精品从实战出发,贴近实战,自己实战,实战为王,在实战中提升自己授人以鱼不如授人以渔通过此系列课程可以提高3-5年oracle水平交个朋友,物有所值,诚意满满走心课程,把自己在运维中的坑,提炼知识后,实战给大家 三课程内容 0.理论知识部分(上传中。。。)   0.1数据库监听(动态监听,静态监听,多个ip同时监听1521,一个ip监听多个service_name)   0.2rman 命令中的set rename datafile和 alter database  rename datafile 有啥区别?   0.3    ............1.数据库单实例安装  1.0 安装检查    1.0.1安装包检查    1.0.2修改系统参数    1.0.3数据库用户创建    1.0.4创建目录    1.0.5上传安装软件包    1.0.6修改oracle用户环境变量  1.1 rhel7系统图形安装oracle 19c单实例数据库  1.2 rhel7系统命令行安装       1.2.0命令行安装数据库软件       1.2.1命令行创建non cdb数据库实例       1.2.2命令行创建 cdb数据库实例2.rac数据库安装    1.课程结束成果演示          1.1 用workstation,安装一套rhel7+oracle19c+rac+multipath+共享存储+DNS服务器+DNS客户端+NTP服务器+NTP客户端的生产环境          1.2 怎样打oracle19c的rac补丁(包括GI补丁,oracle补丁,数据库补丁,OJVM补丁,bug补丁)     2.安装openfiler软件,模拟共享存储+配置多路径访问       2.1安装openfiler软件       2.2配置openfiler软件(配置2个虚拟网卡,模拟服务器的2个HBA卡)        2.3创建ocr磁盘       2.4创建mgmt磁盘       2.5创建数据文件磁盘       2.6创建归档日志磁盘     3.安装2台数据库服务器       3.1安装2台数据库服务器RHEL7.5       3.2配置服务器双网卡绑定+配置服务器心跳线     4.安装多路径软件识别共享存储中的磁盘        4.1安装服务器本地yum源        4.2安装iscsi软件,配置多路径配置文件,识别共享存储中的磁盘        4.3识别ocr磁盘        4.4识别mgmt磁盘        4.5识别数据文件磁盘        4.6识别归档日志磁盘     5.oracle19c的rac环境系统参数官方说明        5.1如何配置oracle19c的rac的系统参数(我们参考官方说明)        5.2oracle19c+rac环境Best Practices 官方说明文档     6.安装oracle19c+rac之前的准备工作        6.1修改/etc/hosts文件        6.2配置DNS服务器+DNS客户端+NTP服务器+NTP客户端        6.3创建用户和组        6.4创建目录        6.5修改用户环境变量        6.6安装相关软件包        6.7配置ssh互信        6.9禁用服务器透明大页     7.安装oracle+19c+rac软件       7.1安装GI软件       7.2创建ASM磁盘,主要是数据文件磁盘和归档日志磁盘       7.3安装数据库软件       7.4创建数据库实例       7.5日常常用维护集群命令(启停数据库,启停集群,查看监听,教同学们怎样不死记命令,而且命令还正确)     8.打补丁     8.1打GI和ORACLE的操作系统补丁      8.2打OJVM补丁      8.3打ORA600的bug补丁     9.课程总结和成果演示     9.1课程总结和成果演示3.rac+dg(单实例)数据库安装(pdb架构)     3.1.1dg知识点讲解     3.1.2配置dg监听,密码文件,参数文件。     3.1.2通过rman的duplicate命令进行dg搭建1。     3.1.3通过rman的duplicate命令进行dg搭建2     3.1.4进行数据库切换需要的配置。     3.1.5数据库正常switch over     3.1.6数据库如何fail over     3.1.7dg库failover以后通过闪回快速恢复dg     3.1.8dg库failover以后通过新主库的控制文件快速恢复dg     3.1.9备库归档缺失如何进行解决。     3.1.10recover database和recover standby database是否可以在dg中使用?     3.1.11如何通过rman的备份进行搭建dg。     3.1.12dg库使用静态监听无法监听pdb数据库的service问题如何进行解决?   4.rac+rac dg的实战步骤(pdb架构)(上传中。。。)5.19c单实例数据库通过rman备份进行异机迁移到单实例数据库     5.1通过备份脚本进行数据,归档,控制文件备份     5.2通过备份脚本进行归档,控制文件备份       (注意源库备份目录是/backup/db和/backup/ar)     5.3传输备份文件到目标库        (传输备份文件到目标库的/home/oracle/bk目录)     5.4利用参数文件启动数据库到nomount     5.5利用备份集恢复控制文件,并启动数据库到mount     5.6通过restore database恢复数据库        5.6.1注册目标库备份集到控制文件        5.6.2启动数据库到mount状态,确定recover database的序列号     5.7recover database        5.7.1通过rman 进行recover database        5.7.2通过sql 命令行进行 recover database;     5.8.打开数据库          5.8.1解决打开数据库后,sys用户无法远程监听登录问题          5.8.2修改数据库动态参数启动数据库     5.9.备份的扩展             5.9.1如何知道备份集里面有哪些归档             5.9.2如何从这些备份集中提取归档             5.9.3进行异机数据库迁移时,如何逐步应用归档,并且如何open read only数据库后,继续应用归档             5.9.4为何要进行 open read only进行提前打开验证。               5.10.rman迁移备份的补充             5.10.1如何再rman中设置数据文件,在线日志生成路径。               类似如下命令                    run  6单实例数据库无数据丢失通过rman备份异机迁移到rac数据库和rac数据库通过rman迁移到rac数据库      6.1单实例源库进行数据库升级           19.3的源库升级到19.13版本(包括打数据库补丁和ojvm补丁)      6.2.传输备份文件到目标库           传输备份文件到目标库的/home/oracle/bk目录     6.3.利用参数文件启动数据库到nomount     6.4.利用备份集恢复控制文件,并启动数据库到mount        6.5.通过restore database恢复数据库           注册目标库备份集到控制文件           启动数据库到mount状态,确定recover database的序列号     6.6.recover database          通过rman 进行recover database          通过sql 命令行进行 recover database;     6.7.单实例数据库恢复完成后,配置为rac数据库           注册数据库到集群          修改数据库参数文件到asm     6.8.迁移rac数据库到rac数据库。           单实例数据库异机迁移到rac和,rac数据库异机迁移到rac有啥不一样。           根据上面理论,实施rac数据库异机恢复到rac7数据库本地恢复系列     7.1单实例数据库本地恢复     7.2rac数据库本地恢复8综合实战(uploading)     7.1实战课题:        有一台11.2.0.3的单实例数据库A,数据库容量有20T,无备份。        如何迁移到新搭建的rac环境B(数据库版本是19.13),并且是迁移到rac的pdb数据库中,并且rac数据库的asm容量只有21T.        这次实战包含的知识点。        1-如何在环境B复制数据库A的软件,最好进行复制,因为数据库A的11.2.0.3打了很多补丁,如果安装11.2.0.3软件,会造成版本不一致。        2-如何搭建11.2.0.3的单实例dg。        3-dg归档缺失如何解决。        4-如何升级11.2.0.3单实例到11.2.0.4单实例        5-如何升级11.2.0.4单实例到19.3单实例        6-如何升级19.3单实例到19.13单实例。        7-如何迁移19.13单实例数据库到19.13的rac的pdb数据库中。9数据库升级系列     8.1 单实例19c数据库升级到19.13版本。     8.2 单实例12.2.0.1数据库升级到19.13版本。     8.3 单实例12.1.0.2数据库升级到19.13版本。     8.4 19c数据库rac升级到19.13版本。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧