<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hanxinyu</title>
    <description></description>
    <link>http://hanxinyu.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>c/c++ API函数大全</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/134473" style="color:red;">http://hanxinyu.javaeye.com/blog/134473</a>&nbsp;
          发表时间: 2007年10月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1. API之网络函数 <br />
<br />
WNetAddConnection 创建同一个网络资源的永久性连接 <br />
WNetAddConnection2 创建同一个网络资源的连接 <br />
WNetAddConnection3 创建同一个网络资源的连接 <br />
WNetCancelConnection 结束一个网络连接 <br />
WNetCancelConnection2 结束一个网络连接 <br />
WNetCloseEnum 结束一次枚举操作 <br />
WNetConnectionDialog 启动一个标准对话框，以便建立同网络资源的连接 <br />
WNetDisconnectDialog 启动一个标准对话框，以便断开同网络资源的连接 <br />
WNetEnumResource 枚举网络资源 <br />
WNetGetConnection 获取本地或已连接的一个资源的网络名称 <br />
WNetGetLastError 获取网络错误的扩展错误信息 <br />
WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC（统一命名规范）名称 <br />
WNetGetUser 获取一个网络资源用以连接的名字 <br />
WNetOpenEnum 启动对网络资源进行枚举的过程 <br />
<br />
2. API之消息函数 <br />
<br />
BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口 <br />
GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 <br />
GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 <br />
PostMessage 将一条消息投递到指定窗口的消息队列 <br />
PostThreadMessage 将一条消息投递给应用程序 <br />
RegisterWindowMessage 获取分配给一个字串标识符的消息编号 <br />
ReplyMessage 答复一个消息 <br />
SendMessage 调用一个窗口的窗口函数，将一条消息发给那个窗口 <br />
SendMessageCallback 将一条消息发给窗口 <br />
SendMessageTimeout 向窗口发送一条消息 <br />
SendNotifyMessage 向窗口发送一条消息 <br />
<br />
3. API之文件处理函数 <br />
<br />
CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 <br />
CompareFileTime 对比两个文件的时间 <br />
CopyFile 复制文件 <br />
CreateDirectory 创建一个新目录 <br />
CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台 <br />
CreateFileMapping 创建一个新的文件映射对象 <br />
DeleteFile 删除指定文件 <br />
DeviceIoControl 对设备执行指定的操作 <br />
DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值 <br />
FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值 <br />
FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间 <br />
FileTimeToSystemTime 根据一个FILETIME结构的内容，装载一个SYSTEMTIME结构 <br />
FindClose 关闭由FindFirstFile函数创建的一个搜索句柄 <br />
FindFirstFile 根据文件名查找文件 <br />
FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件 <br />
FlushFileBuffers 针对指定的文件句柄，刷新内部文件缓冲区 <br />
FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘 <br />
GetBinaryType 判断文件是否可以执行 <br />
GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 <br />
GetCurrentDirectory 在一个缓冲区中装载当前目录 <br />
GetDiskFreeSpace 获取与一个磁盘的组织有关的信息，以及了解剩余空间的容量 <br />
GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息 <br />
GetDriveType 判断一个磁盘驱动器的类型 <br />
GetExpandedName 取得一个压缩文件的全名 <br />
GetFileAttributes 判断指定文件的属性 <br />
GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制 <br />
GetFileSize 判断文件长度 <br />
GetFileTime 取得指定文件的时间信息 <br />
GetFileType 在给出文件句柄的前提下，判断文件类型 <br />
GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息 <br />
GetFileVersionInfoSize 针对包含了版本资源的一个文件，判断容纳文件版本信息需要一个多大的缓冲区 <br />
GetFullPathName 获取指定文件的完整路径名 <br />
GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母 <br />
GetLogicalDriveStrings 获取一个字串，其中包含了当前所有逻辑驱动器的根驱动器路径 <br />
GetOverlappedResult 判断一个重叠操作当前的状态 <br />
GetPrivate<span href="tag.php?name=Pro" class="t_tag" onclick="tagshow(event)">Pro</span>fileInt 为初始化文件（.ini文件）中指定的条目获取一个整数值 <br />
GetPrivateProfileSection 获取指定小节（在.ini文件中）所有项名和值的一个列表 <br />
GetPrivateProfileString 为初始化文件中指定的条目取得字串 <br />
GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值 <br />
GetProfileSection 获取指定小节（在win.ini文件中）所有项名和值的一个列表 <br />
GetProfileString 为win.ini初始化文件中指定的条目取得字串 <br />
GetShortPathName 获取指定文件的短路径名 <br />
GetSystemDirectory 取得Windows系统目录（即System目录）的完整路径名 <br />
GetTempFileName 这个函数包含了一个临时文件的名字，它可由应用程序使用 <br />
GetTempPath 获取为临时文件指定的路径 <br />
GetVolumeInformation 获取与一个磁盘卷有关的信息 <br />
GetWindowsDirectory 获取Windows目录的完整路径名 <br />
hread 参考lread <br />
hwrite 参考lwrite函数 <br />
lclose 关闭指定的文件 <br />
lcreat 创建一个文件 <br />
llseek 设置文件中进行读写的当前位置 <br />
LockFile 锁定文件的某一部分，使其不与其他应用程序共享 <br />
LockFileEx 与LockFile相似，只是它提供了更多的功能 <br />
lopen 以二进制模式打开指定的文件 <br />
lread 将文件中的数据读入内存缓冲区 <br />
lwrite 将数据从内存缓冲区写入一个文件 <br />
LZClose 关闭由LZOpenFile 或 LZInit函数打开的一个文件 <br />
LZCopy 复制一个文件 <br />
LZInit 这个函数用于初始化内部缓冲区 <br />
LZOpenFile 该函数能执行大量不同的文件处理，而且兼容于压缩文件 <br />
LZRead 将数据从文件读入内存缓冲区 <br />
LZSeek 设置一个文件中进行读写的当前位置 <br />
MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间 <br />
MoveFile 移动文件 <br />
OpenFile 这个函数能执行大量不同的文件操作 <br />
OpenFileMapping 打开一个现成的文件映射对象 <br />
QueryDosDevice 在Windows NT中，DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况 <br />
ReadFile 从文件中读出数据 <br />
ReadFileEx 与ReadFile相似，只是它只能用于异步读操作，并包含了一个完整的回调 <br />
RegClose<span href="tag.php?name=Key" class="t_tag" onclick="tagshow(event)">Key</span> 关闭系统注册表中的一个项（或键） <br />
RegConnectRegistry 访问远程系统的部分注册表 <br />
RegCreateKey 在指定的项下创建或打开一个项 <br />
RegCreateKeyEx 在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数 <br />
RegDeleteKey 删除现有项下方一个指定的子项 <br />
RegDeleteValue 删除指定项下方的一个值 <br />
RegEnumKey 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx <br />
RegEnumKeyEx 枚举指定项下方的子项 <br />
RegEnumValue 枚举指定项的值 <br />
RegFlushKey 将对项和它的子项作出的改动实际写入磁盘 <br />
RegGetKeySecurity 获取与一个注册表项有关的安全信息 <br />
RegLoadKey 从以前用RegSaveKey函数创建的一个文件里装载注册表信息 <br />
RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化时，用这个函数提供一种通知机制 <br />
RegOpenKey 打开一个现有的注册表项 <br />
RegOpenKeyEx 打开一个现有的项。在win32下推荐使用这个函数 <br />
RegQueryInfoKey 获取与一个项有关的信息 <br />
RegQueryValue 取得指定项或子项的默认（未命名）值 <br />
RegQueryValueEx 获取一个项的设置值 <br />
RegReplaceKey 用一个磁盘文件保存的信息替换注册表信息；并创建一个备份，在其中包含当前注册表信息 <br />
RegRestoreKey 从一个磁盘文件恢复注册表信息 <br />
RegSaveKey 将一个项以及它的所有子项都保存到一个磁盘文件 <br />
RegSetKeySecurity 设置指定项的安全特性 <br />
RegSetValue 设置指定项或子项的默认值 <br />
RegSetValueEx 设置指定项的值 <br />
RegUnLoadKey 卸载指定的项以及它的所有子项 <br />
RemoveDirectory 删除指定目录 <br />
SearchPath 查找指定文件 <br />
SetCurrentDirectory 设置当前目录 <br />
SetEndOfFile 针对一个打开的文件，将当前文件位置设为文件末尾 <br />
SetFileAttributes 设置文件属性 <br />
SetFilePointer 在一个文件中设置当前的读写位置 <br />
SetFileTime 设置文件的创建、访问及上次修改时间 <br />
SetHandleCount 这个函数不必在win32下使用；即使使用，也不会有任何效果 <br />
SetVolumeLabel 设置一个磁盘的卷标（Label） <br />
SystemTimeToFileTime 根据一个FILETIME结构的内容，载入一个SYSTEMTIME结构 <br />
UnlockFile 解除对一个文件的锁定 <br />
UnlockFileEx 解除对一个文件的锁定 <br />
UnmapViewOfFile 在当前应用程序的内存地址空间解除对一个文件映射对象的映射 <br />
VerFindFile 用这个函数决定一个文件应安装到哪里 <br />
VerInstallFile 用这个函数安装一个文件 <br />
VerLanguageName 这个函数能根据16位语言代码获取一种语言的名称 <br />
VerQueryValue 这个函数用于从版本资源中获取信息 <br />
WriteFile 将数据写入一个文件 <br />
WriteFileEx 与WriteFile类似，只是它只能用于异步写操作，并包括了一个完整的回调 <br />
WritePrivateProfileSection 为一个初始化文件（.ini）中指定的小节设置所有项名和值 <br />
WritePrivateProfileString 在初始化文件指定小节内设置一个字串 <br />
WriteProfileSection 为Win.ini初始化文件中一个指定的小节设置所有项名和值 <br />
WriteProfileString 在Win.ini初始化文件指定小节内设置一个字串 <br />
<br />
4. API之打印函数 <br />
AbortDoc 取消一份文档的打印 <br />
AbortPrinter 删除与一台打印机关联在一起的缓冲文件 <br />
AddForm 为打印机的表单列表添加一个新表单 <br />
AddJob 用于获取一个有效的路径名，以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号 <br />
AddMonitor 为系统添加一个打印机监视器 <br />
AddPort 启动&ldquo;添加端口&rdquo;对话框，允许用户在系统可用端口列表中加入一个新端口 <br />
AddPrinter 在系统中添加一台新打印机 <br />
AddPrinterConnection 连接指定的打印机 <br />
AddPrinterDriver 为指定的系统添加一个打印驱动程序 <br />
AddPrintProcessor 为指定的系统添加一个打印处理器 <br />
AddPrintProvidor 为系统添加一个打印供应商 <br />
AdvancedDocumentProperties 启动打印机文档设置对话框 <br />
ClosePrinter 关闭一个打开的打印机对象 <br />
ConfigurePort 针对指定的端口，启动一个端口配置对话框 <br />
ConnectToPrinterDlg 启动连接打印机对话框，用它同访问网络的打印机连接 <br />
DeleteForm 从打印机可用表单列表中删除一个表单 <br />
DeleteMonitor 删除指定的打印监视器 <br />
DeletePort 启动&ldquo;删除端口&rdquo;对话框，允许用户从当前系统删除一个端口 <br />
DeletePrinter 将指定的打印机标志为从系统中删除 <br />
DeletePrinterConnection 删除与指定打印机的连接 <br />
DeletePrinterDriver 从系统删除一个打印机驱动程序 <br />
DeletePrintProcessor 从指定系统删除一个打印处理器 <br />
DeletePrintProvidor 从系统中删除一个打印供应商 <br />
DeviceCapabilities 利用这个函数可获得与一个设备的能力有关的信息 <br />
DocumentProperties 打印机配置控制函数 <br />
EndDocAPI 结束一个成功的打印作业 <br />
EndDocPrinter 在后台打印程序的级别指定一个文档的结束 <br />
EndPage 用这个函数完成一个页面的打印，并准备设备场景，以便打印下一个页 <br />
EndPagePrinter 指定一个页在打印作业中的结尾 <br />
EnumForms 枚举一台打印机可用的表单 <br />
EnumJobs 枚举打印队列中的作业 <br />
EnumMonitors 枚举可用的打印监视器 <br />
EnumPorts 枚举一个系统可用的端口 <br />
EnumPrinterDrivers 枚举指定系统中已安装的打印机驱动程序 <br />
EnumPrinters 枚举系统中安装的打印机 <br />
EnumPrintProcessorDatatypes 枚举由一个打印处理器支持的数据类型 <br />
EnumPrintProcessors 枚举系统中可用的打印处理器 <br />
Escape 设备控制函数 <br />
FindClosePrinterChangeNotification 关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象 <br />
FindFirstPrinterChangeNotification 创建一个新的改变通告对象，以便我们注意打印机状态的各种变化 <br />
FindNextPrinterChangeNotification 用这个函数判断触发一次打印机改变通告信号的原因 <br />
FreePrinterNotifyInfo 释放由FindNextPrinterChangeNotification函数分配的一个缓冲区 <br />
GetForm 取得与指定表单有关的信息 <br />
GetJob 获取与指定作业有关的信息 <br />
GetPrinter 取得与指定打印机有关的信息 <br />
GetPrinterData 为打印机设置注册表配置信息 <br />
GetPrinterDriver 针对指定的打印机，获取与打印机驱动程序有关的信息 <br />
GetPrinterDriverDirectory 判断指定系统中包含了打印机驱动程序的目录是什么 <br />
GetPrintProcessorDirectory 判断指定系统中包含了打印机处理器驱动程序及文件的目录 <br />
OpenPrinter 打开指定的打印机，并获取打印机的句柄 <br />
PrinterMessageBox 在拥有指定打印作业的系统上显示一个打印机出错消息框 <br />
PrinterProperties 启动打印机属性对话框，以便对打印机进行配置 <br />
ReadPrinter 从打印机读入数据 <br />
ResetDC 重设一个设备场景 <br />
ResetPrinter 改变指定打印机的默认数据类型及文档设置 <br />
ScheduleJob 提交一个要打印的作业 <br />
SetAbortProc 为Windows指定取消函数的地址 <br />
SetForm 为指定的表单设置信息 <br />
SetJob 对一个打印作业的状态进行控制 <br />
SetPrinter 对一台打印机的状态进行控制 <br />
SetPrinterData 设置打印机的注册表配置信息 <br />
StartDoc 开始一个打印作业 <br />
StartDocPrinter 在后台打印的级别启动一个新文档 <br />
StartPage 打印一个新页前要先调用这个函数 <br />
StartPagePrinter 在打印作业中指定一个新页的开始 <br />
WritePrinter 将发送目录中的数据写入打印机 <br />
<br />
5. API之文本和字体函数 <br />
<br />
AddFontResource 在Windows系统中添加一种字体资源 <br />
CreateFont 用指定的属性创建一种逻辑字体 <br />
CreateFontIndirect 用指定的属性创建一种逻辑字体 <br />
CreateScalableFontResource 为一种TureType字体创建一个资源文件，以便能用API函数AddFontResource将其加入Windows系统 <br />
DrawText 将文本描绘到指定的矩形中 <br />
DrawTextEx 与DrawText相似，只是加入了更多的功能 <br />
EnumFontFamilies 列举指定设备可用的字体 <br />
EnumFontFamiliesEx 列举指定设备可用的字体 <br />
EnumFonts 列举指定设备可用的字体 <br />
ExtTextOut 经过扩展的文本描绘函数。也请参考SetTextAlign函数 <br />
GetAspectRatioFilterEx 用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时，本函数可判断纵横比大小 <br />
GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小 <br />
GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸 <br />
GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串 <br />
GetCharWidth 调查字体中一个或多个字符的宽度 <br />
GetFontData 接收一种可缩放字体文件的数据 <br />
GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息 <br />
GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息 <br />
GetKerningPairs 取得指定字体的字距信息 <br />
GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息 <br />
GetRasterizerCaps 了解系统是否有能力支持可缩放的字体 <br />
GetTabbedTextExtent 判断一个字串占据的范围，同时考虑制表站扩充的因素 <br />
GetTextAlign 接收一个设备场景当前的文本对齐标志 <br />
GetTextCharacterExtra 判断额外字符间距的当前值 <br />
GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符 <br />
GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息 <br />
GetTextColor 判断当前字体颜色。通常也称为&ldquo;前景色&rdquo; <br />
GetTextExtentExPoint 判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息 <br />
GetTextExtentPoint 判断一个字串的大小（范围） <br />
GetTextFace 获取一种字体的字样名 <br />
GetTextMetrics 获取与选入一种设备场景的物理字体有关的信息 <br />
GrayString 描绘一个以灰色显示的字串。通常由Windows用于标识禁止状态 <br />
PolyTextOut 描绘一系列字串 <br />
RemoveFontResource 从Windows系统中删除一种字体资源 <br />
SetMapperFlags Windows对字体进行映射时，可用该函数选择与目标设备的纵横比相符的光栅字体 <br />
SetTextAlign 设置文本对齐方式，并指定在文本输出过程中使用设备场景的当前位置 <br />
SetTextCharacterExtra 描绘文本的时候，指定要在字符间插入的额外间距 <br />
SetTextColor 设置当前文本颜色。这种颜色也称为&ldquo;前景色&rdquo; <br />
SetTextJustification 通过指定一个文本行应占据的额外空间，可用这个函数对文本进行两端对齐处理 <br />
TabbedTextOut 支持制表站的一个文本描绘函数 <br />
TextOut 文本绘图函数 <br />
<br />
6. API之菜单函数 <br />
<br />
AppendMenu 在指定的菜单里添加一个菜单项 <br />
CheckMenuItem 复选或撤消复选指定的菜单条目 <br />
CheckMenuRadioItem 指定一个菜单条目被复选成&ldquo;单选&rdquo;项目 <br />
CreateMenu 创建新菜单 <br />
CreatePopupMenu 创建一个空的弹出式菜单 <br />
DeleteMenu 删除指定的菜单条目 <br />
DestroyMenu 删除指定的菜单 <br />
DrawMenuBar 为指定的窗口重画菜单 <br />
EnableMenuItem 允许或禁止指定的菜单条目 <br />
GetMenu 取得窗口中一个菜单的句柄 <br />
GetMenuCheckMarkDimensions 返回一个菜单复选符的大小 <br />
GetMenuContextHelpId 取得一个菜单的帮助场景ID <br />
GetMenuDefaultItem 判断菜单中的哪个条目是默认条目 <br />
GetMenuItemCount 返回菜单中条目（菜单项）的数量 <br />
GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID <br />
GetMenuItemInfo 取得（接收）与一个菜单条目有关的特定信息 <br />
GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息 <br />
GetMenuState 取得与指定菜单条目状态有关的信息 <br />
GetMenuString 取得指定菜单条目的字串 <br />
GetSubMenu 取得一个弹出式菜单的句柄，它位于菜单中指定的位置 <br />
GetSystemMenu 取得指定窗口的系统菜单的句柄 <br />
HiliteMenuItem 控制顶级菜单条目的加亮显示状态 <br />
InsertMenu 在菜单的指定位置处插入一个菜单条目，并根据需要将其他条目向下移动 <br />
InsertMenuItem 插入一个新菜单条目 <br />
IsMenu 判断指定的句柄是否为一个菜单的句柄 <br />
LoadMenu 从指定的模块或应用程序实例中载入一个菜单 <br />
LoadMenuIndirect 载入一个菜单 <br />
MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点 <br />
ModifyMenu 改变菜单条目 <br />
RemoveMenu 删除指定的菜单条目 <br />
SetMenu 设置窗口菜单 <br />
SetMenuContextHelpId 设置一个菜单的帮助场景ID <br />
SetMenuDefaultItem 将一个菜单条目设为默认条目 <br />
SetMenuItemBitmaps 设置一幅特定位图，令其在指定的菜单条目中使用，代替标准的复选符号（&radic;） <br />
SetMenuItemInfo 为一个菜单条目设置指定的信息 <br />
TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单 <br />
TrackPopupMenuEx 与TrackPopupMenu相似，只是它提供了额外的功能 <br />
<br />
7. API之位图、图标和光栅运算函数 <br />
BitBlt 将一幅位图从一个设备场景复制到另一个 <br />
CopyIcon 制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序 <br />
CopyImage 复制位图、图标或指针，同时在复制过程中进行一些转换工作 <br />
CreateBitmap 按照规定的格式创建一幅与设备有关位图 <br />
CreateBitmapIndirect 创建一幅与设备有关位图 <br />
CreateCompatibleBitmap 创建一幅与设备有关位图，它与指定的设备场景兼容 <br />
CreateCursor 创建一个鼠标指针 <br />
CreateDIBitmap 根据一幅与设备无关的位图创建一幅与设备有关的位图 <br />
CreateDIBSection 创建一个DIBSection <br />
CreateIcon 创建一个图标 <br />
CreateIconIndirect 创建一个图标 <br />
DestroyCursor 清除指定的鼠标指针，并释放它占用的所有系统资源 <br />
DestroyIcon 清除图标 <br />
DrawIcon 在指定的位置画一个图标 <br />
DrawIconEx 描绘一个图标或鼠标指针。与DrawIcon相比，这个函数提供了更多的功能 <br />
ExtractAssociatedIcon 判断一个可执行程序或DLL中是否存在图标，或是否有图标与系统注册表中指定的文件存在关联并提取之 <br />
ExtractIcon 判断一个可执行文件或DLL中是否有图标存在，并将其提取出来 <br />
GetBitmapBits 将来自位图的二进制位复制到一个缓冲区 <br />
GetBitmapDimensionEx 取得一幅位图的宽度和高度 <br />
GetDIBColorTable 从选入设备场景的DIBSection中取得颜色表信息 <br />
GetDIBits 将来自一幅位图的二进制位复制到一幅与设备无关的位图里 <br />
GetIconInfo 取得与图标有关的信息 <br />
GetStretchBltMode 判断StretchBlt 和 StretchDIBits函数采用的伸缩模式 <br />
LoadBitmap 从指定的模块或应用程序实例中载入一幅位图 <br />
LoadCursor 从指定的模块或应用程序实例中载入一个鼠标指针 <br />
LoadCursorFromFile 在一个指针文件或一个动画指针文件的基础上创建一个指针 <br />
LoadIcon 从指定的模块或应用程序实例中载入一个图标 <br />
LoadImage 载入一个位图、图标或指针 <br />
MaskBlt 执行复杂的图象传输，同时进行掩模（MASK）处理 <br />
PatBlt 在当前选定的刷子的基础上，用一个图案填充指定的设备场景 <br />
PlgBlt 复制一幅位图，同时将其转换成一个平行四边形。利用它可对位图进行旋转处理 <br />
SetBitmapBits 将来自缓冲区的二进制位复制到一幅位图 <br />
SetBitmapDimensionEx 设置一幅位图的宽度。以一毫米的十分之一为单位 <br />
SetDIBColorTable 设置选入设备场景的一个DIBSection的颜色表信息 <br />
SetDIBits 将来自与设备无关位图的二进制位复制到一幅与设备有关的位图里 <br />
SetDIBitsToDevice 将一幅与设备无关位图的全部或部分数据直接复制到一个设备 <br />
SetStretchBltMode 指定StretchBlt 和 StretchDIBits函数的伸缩模式 <br />
StretchBlt 将一幅位图从一个设备场景复制到另一个 <br />
StretchDIBits 将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景</p>
<p>8. API之绘图函数 <br />
<br />
AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作 <br />
AngleArc 用一个连接弧画一条线 <br />
Arc 画一个圆弧 <br />
BeginPath 启动一个路径分支 <br />
CancelDC 取消另一个线程里的长时间绘图操作 <br />
Chord 画一个弦 <br />
CloseEnhMetaFile 关闭指定的增强型图元文件设备场景，并将新建的图元文件返回一个句柄 <br />
CloseFigure 描绘到一个路径时，关闭当前打开的图形 <br />
CloseMetaFile 关闭指定的图元文件设备场景，并向新建的图元文件返回一个句柄 <br />
CopyEnhMetaFile 制作指定增强型图元文件的一个副本（拷贝） <br />
CopyMetaFile 制作指定（标准）图元文件的一个副本 <br />
CreateBrushIndirect 在一个LOGBRUSH数据结构的基础上创建一个刷子 <br />
CreateDIBPatternBrush 用一幅与设备无关的位图创建一个刷子，以便指定刷子样式（图案） <br />
CreateEnhMetaFile 创建一个增强型的图元文件设备场景 <br />
CreateHatchBrush 创建带有阴影图案的一个刷子 <br />
CreateMetaFile 创建一个图元文件设备场景 <br />
CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子 <br />
CreatePen 用指定的样式、宽度和颜色创建一个画笔 <br />
CreatePenIndirect 根据指定的LOGPEN结构创建一个画笔 <br />
CreateSolidBrush 用纯色创建一个刷子 <br />
DeleteEnhMetaFile 删除指定的增强型图元文件 <br />
DeleteMetaFile 删除指定的图元文件 <br />
DeleteObject 删除GDI对象，对象使用的所有系统资源都会被释放 <br />
DrawEdge 用指定的样式描绘一个矩形的边框 <br />
DrawEscape 换码（Escape）函数将数据直接发至显示设备驱动程序 <br />
DrawFocusRect 画一个焦点矩形 <br />
DrawFrameControl 描绘一个标准控件 <br />
DrawState 为一幅图象或绘图操作应用各式各样的效果 <br />
Ellipse 描绘一个椭圆，由指定的矩形围绕 <br />
EndPath 停止定义一个路径 <br />
EnumEnhMetaFile 针对一个增强型图元文件，列举其中单独的图元文件记录 <br />
EnumMetaFile 为一个标准的windows图元文件枚举单独的图元文件记录 <br />
EnumObjects 枚举可随同指定设备场景使用的画笔和刷子 <br />
ExtCreatePen 创建一个扩展画笔（装饰或几何） <br />
ExtFloodFill 在指定的设备场景里，用当前选择的刷子填充一个区域 <br />
FillPath 关闭路径中任何打开的图形，并用当前刷子填充 <br />
FillRect 用指定的刷子填充一个矩形 <br />
FlattenPath 将一个路径中的所有曲线都转换成线段 <br />
FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域 <br />
FrameRect 用指定的刷子围绕一个矩形画一个边框 <br />
GdiComment 为指定的增强型图元文件设备场景添加一条注释信息 <br />
GdiFlush 执行任何未决的绘图操作 <br />
GdiGetBatchLimit 判断有多少个GDI绘图命令位于队列中 <br />
GdiSetBatchLimit 指定有多少个GDI绘图命令能够进入队列 <br />
GetArcDirection 画圆弧的时候，判断当前采用的绘图方向 <br />
GetBkColor 取得指定设备场景当前的背景颜色 <br />
GetBkMode 针对指定的设备场景，取得当前的背景填充模式 <br />
GetBrushOrgEx 判断指定设备场景中当前选定刷子起点 <br />
GetCurrentObject 获得指定类型的当前选定对象 <br />
GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置 <br />
GetEnhMetaFile 取得磁盘文件中包含的一个增强型图元文件的图元文件句柄 <br />
GetEnhMetaFileBits 将指定的增强型图元文件复制到一个内存缓冲区里 <br />
GetEnhMetaFileDescription 返回对一个增强型图元文件的说明 <br />
GetEnhMetaFileHeader 取得增强型图元文件的图元文件头 <br />
GetEnhMetaFilePaletteEntries 取得增强型图元文件的全部或部分调色板 <br />
GetMetaFile 取得包含在一个磁盘文件中的图元文件的图元文件句柄 <br />
GetMetaFileBitsEx 将指定的图元文件复制到一个内存缓冲区 <br />
GetMiterLimit 取得设备场景的斜率限制（Miter）设置 <br />
GetNearestColor 根据设备的显示能力，取得与指定颜色最接近的一种纯色 <br />
GetObjectAPI 取得对指定对象进行说明的一个结构 <br />
GetObjectType 判断由指定句柄引用的GDI对象的类型 <br />
GetPath 取得对当前路径进行定义的一系列数据 <br />
GetPixel 在指定的设备场景中取得一个像素的RGB值 <br />
GetPolyFillMode 针对指定的设备场景，获得多边形填充模式 <br />
GetROP2 针对指定的设备场景，取得当前的绘图模式 <br />
GetStockObject 取得一个固有对象（Stock） <br />
GetSysColorBrush 为任何一种标准系统颜色取得一个刷子 <br />
GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据，将一个增强型图元文件转换成标准windows图元文件 <br />
InvertRect 通过反转每个像素的值，从而反转一个设备场景中指定的矩形 <br />
LineDDA 枚举指定线段中的所有点 <br />
LineTo 用当前画笔画一条线，从当前位置连到一个指定的点 <br />
MoveToEx 为指定的设备场景指定一个新的当前画笔位置 <br />
PaintDesk 在指定的设备场景中描绘桌面墙纸图案 <br />
PathToRegion 将当前选定的路径转换到一个区域里 <br />
Pie 画一个饼图 <br />
PlayEnhMetaFile 在指定的设备场景中画一个增强型图元文件 <br />
PlayEnhMetaFileRecord 回放单独一条增强型图元文件记录 <br />
PlayMetaFile 在指定的设备场景中回放一个图元文件 <br />
PlayMetaFileRecord 回放来自图元文件的单条记录 <br />
PolyBezier 描绘一条或多条贝塞尔（Bezier）曲线 <br />
PolyDraw 描绘一条复杂的曲线，由线段及贝塞尔曲线组成 <br />
Polygon 描绘一个多边形 <br />
Polyline 用当前画笔描绘一系列线段 <br />
PolyPolygon 用当前选定画笔描绘两个或多个多边形 <br />
PolyPolyline 用当前选定画笔描绘两个或多个多边形 <br />
Rectangle 用当前选定的画笔描绘矩形，并用当前选定的刷子填充 <br />
RoundRect 用当前选定的画笔画一个圆角矩形，并用当前选定的刷子在其中填充 <br />
SelectClipPath 将设备场景当前的路径合并到剪切区域里 <br />
SelectObject 为当前设备场景选择图形对象 <br />
SetArcDirection 设置圆弧的描绘方向 <br />
SetBkColor 为指定的设备场景设置背景颜色 <br />
SetBkMode 指定阴影刷子、虚线画笔以及字符中的空隙的填充方式 <br />
SetBrushOrgEx 为指定的设备场景设置当前选定刷子的起点 <br />
SetEnhMetaFileBits 用指定内存缓冲区内包含的数据创建一个增强型图元文件 <br />
SetMetaFileBitsEx 用包含在指定内存缓冲区内的数据结构创建一个图元文件 <br />
SetMiterLimit 设置设备场景当前的斜率限制 <br />
SetPixel 在指定的设备场景中设置一个像素的RGB值 <br />
SetPixelV 在指定的设备场景中设置一个像素的RGB值 <br />
SetPolyFillMode 设置多边形的填充模式 <br />
SetROP2 设置指定设备场景的绘图模式。与vb的DrawMode属性完全一致 <br />
SetWinMetaFileBits 将一个标准Windows图元文件转换成增强型图元文件 <br />
StrokeAndFillPath 针对指定的设备场景，关闭路径上打开的所有区域 <br />
StrokePath 用当前画笔描绘一个路径的轮廓。打开的图形不会被这个函数关闭 <br />
UnrealizeObject 将一个刷子对象选入设备场景之前，如刷子的起点准备用SetBrushOrgEx修改，则必须先调用本函数 <br />
WidenPath 根据选定画笔的宽度，重新定义当前选定的路径 <br />
<br />
9. API之设备场景函数 <br />
<br />
CombineRgn 将两个区域组合为一个新区域 <br />
CombineTransform 驱动世界转换。它相当于依顺序进行两次转换 <br />
CreateCompatibleDC 创建一个与特定设备场景一致的内存设备场景 <br />
CreateDC 为专门设备创建设备场景 <br />
CreateEllipticRgn 创建一个椭圆 <br />
CreateEllipticRgnIndirect 创建一个内切于特定矩形的椭圆区域 <br />
CreateIC 为专用设备创建一个信息场景 <br />
CreatePolygonRgn 创建一个由一系列点围成的区域 <br />
CreatePolyPolygonRgn 创建由多个多边形构成的区域。每个多边形都应是封闭的 <br />
CreateRectRgn 创建一个矩形区域 <br />
CreateRectRgnIndirect 创建一个矩形区域 <br />
CreateRoundRectRgn 创建一个圆角矩形 <br />
DeleteDC 删除专用设备场景或信息场景，释放所有相关窗口资源 <br />
DPtoLP 将点阵从设备坐标转换到专用设备场景逻辑坐标 <br />
EqualRgn 确定两个区域是否相等 <br />
ExcludeClipRect 从专用设备场景的剪裁区中去掉一个矩形区。矩形内不能进行绘图 <br />
ExcludeUpdateRgn 从专用设备场景剪裁区去掉指定窗口的刷新区域 <br />
ExtCreateRegion 根据世界转换修改区域 <br />
ExtSelectClipRgn 将指定区域组合到设备场景的当前剪裁区 <br />
FillRgn 用指定刷子填充指定区域 <br />
FrameRgn 用指定刷子围绕指定区域画一个外框 <br />
GetBoundsRect 获取指定设备场景的边界矩形 <br />
GetClipBox 获取完全包含指定设备场景剪裁区的最小矩形 <br />
GetClipRgn 获取设备场景当前剪裁区 <br />
GetDC 获取指定窗口的设备场景 <br />
GetDCEx 为指定窗口获取设备场景。相比GetDC，本函数提供了更多的选项 <br />
GetDCOrgEx 获取指定设备场景起点位置（以屏幕坐标表示） <br />
GetDeviceCaps 根据指定设备场景代表的设备的功能返回信息 <br />
GetGraphicsMode 确定是否允许增强图形模式（世界转换） <br />
GetMapMode 为特定设备场景调入映象模式 <br />
GetRegionData 装入描述一个区域信息的RgnData结构或缓冲区 <br />
GetRgnBox 获取完全包含指定区域的最小矩形 <br />
GetUpdateRgn 确定指定窗口的刷新区域。该区域当前无效，需要刷新 <br />
GetViewportExtEx 获取设备场景视口（viewport）范围 <br />
GetViewportOrgEx 获取设备场景视口起点 <br />
GetWindowDC 获取整个窗口（包括边框、滚动条、标题栏、菜单等）的设备场景 <br />
GetWindowExtEx 获取指定设备场景的窗口范围 <br />
GetWindowOrgEx 获取指定设备场景的逻辑窗口的起点 <br />
GetWindowRgn 获取窗口区域 <br />
GetWorldTransform 如果有世界转换，为设备场景获取当前世界转换 <br />
IntersectClipRect 为指定设备定义一个新的剪裁区 <br />
InvalidateRgn 使窗口指定区域不活动，并将它加入窗口刷新区，使之可随后被重画 <br />
InvertRgn 通过颠倒每个像素值反转设备场景指定区域 <br />
LPtoDP 将点阵从指定设备场景逻辑坐标转换为设备坐标 <br />
ModifyWorldTransform 根据指定的模式修改世界转换 <br />
OffsetClipRgn 按指定量平移设备场景剪裁区 <br />
OffsetRgn 按指定偏移量平移指定区域 <br />
OffsetViewportOrgEx 平移设备场景视口区域 <br />
OffsetWindowOrgEx 平移指定设备场景窗口起点 <br />
PaintRgn 用当前刷子背景色填充指定区域 <br />
PtInRegion 确定点是否在指定区域内 <br />
PtVisible 确定指定点是否可见（即，点是否在设备场景剪裁区内） <br />
RectInRegion 确定矩形是否有部分在指定区域内 <br />
RectVisible 确定指定矩形是否有部分可见（是否在设备场景剪裁区内） <br />
ReleaseDC 释放由调用GetDC或GetWindowDC函数获取的指定设备场景 <br />
RestoreDC 从设备场景堆栈恢复一个原先保存的设备场景 <br />
SaveDC 将指定设备场景状态保存到Windows设备场景堆栈 <br />
ScaleViewportExtEx 缩放设备场景视口的范围 <br />
ScaleWindowExtEx 缩放指定设备场景窗口范围 <br />
ScrollDC 在窗口（由设备场景代表）中水平和（或）垂直滚动矩形 <br />
SelectClipRgn 为指定设备场景选择新的剪裁区 <br />
SetBoundsRect 设置指定设备场景的边界矩形 <br />
SetGraphicsMode 允许或禁止增强图形模式，以提供某些支持（包括世界转换） <br />
SetMapMode 设置指定设备场景的映射模式 <br />
SetRectRgn 设置区域为指定的矩形 <br />
SetViewportExtEx 设置设备场景视口范围 <br />
SetViewportOrgEx 设置设备场景视口起点 <br />
SetWindowExtEx 设置指定设备场景窗口范围 <br />
SetWindowOrgEx 设置指定设备场景窗口起点 <br />
SetWindowRgn 设置窗口区域 <br />
SetWorldTransform 设置世界转换 <br />
ValidateRgn 激活窗口中指定区域，把它从刷新区移走 <br />
WindowFromDC 取回与某一设备场景相关的窗口的句柄 <br />
<br />
10. API之硬件与系统函数 <br />
ActivateKeyboardLayout 激活一个新的键盘布局。键盘布局定义了按键在一种物理性键盘上的位置与含义 <br />
Beep 用于生成简单的声音 <br />
CharToOem 将一个字串从ANSI字符集转换到OEM字符集 <br />
ClipCursor 将指针限制到指定区域 <br />
ConvertDefaultLocale 将一个特殊的地方标识符转换成真实的地方ID <br />
CreateCaret 根据指定的信息创建一个插入符（光标），并将它选定为指定窗口的默认插入符 <br />
DestroyCaret 清除（破坏）一个插入符 <br />
EnumCalendarInfo 枚举在指定&ldquo;地方&rdquo;环境中可用的日历信息 <br />
EnumDateFormats 列举指定的&ldquo;当地&rdquo;设置中可用的长、短日期格式 <br />
EnumSystemCodePages 枚举系统中已安装或支持的代码页 <br />
EnumSystemLocales 枚举系统已经安装或提供支持的&ldquo;地方&rdquo;设置 <br />
EnumTimeFormats 枚举一个指定的地方适用的时间格式 <br />
ExitWindowsEx 退出windows，并用特定的选项重新启动 <br />
ExpandEnvironmentStrings 扩充环境字串 <br />
FreeEnvironmentStrings 翻译指定的环境字串块 <br />
GetACP 判断目前正在生效的ANSI代码页 <br />
GetAsyncKeyState 判断函数调用时指定虚拟键的状态 <br />
GetCaretBlinkTime 判断插入符光标的闪烁频率 <br />
GetCaretPos 判断插入符的当前位置 <br />
GetClipCursor 取得一个矩形，用于描述目前为鼠标指针规定的剪切区域 <br />
GetCommandLine 获得指向当前命令行缓冲区的一个指针 <br />
GetComputerName 取得这台计算机的名称 <br />
GetCPInfo 取得与指定代码页有关的信息 <br />
GetCurrencyFormat 针对指定的&ldquo;地方&rdquo;设置，根据货币格式格式化一个数字 <br />
GetCursor 获取目前选择的鼠标指针的句柄 <br />
GetCursorPos 获取鼠标指针的当前位置 <br />
GetDateFormat 针对指定的&ldquo;当地&rdquo;格式，对一个系统日期进行格式化 <br />
GetDoubleClickTime 判断连续两次鼠标单击之间会被处理成双击事件的间隔时间 <br />
GetEnvironmentStrings 为包含了当前环境字串设置的一个内存块分配和返回一个句柄 <br />
GetEnvironmentVariable 取得一个环境变量的值 <br />
GetInputState 判断是否存在任何待决（等待处理）的鼠标或键盘事件 <br />
GetKBCodePage 由GetOEMCP取代，两者功能完全相同 <br />
GetKeyboardLayout 取得一个句柄，描述指定应用程序的键盘布局 <br />
GetKeyboardLayoutList 获得系统适用的所有键盘布局的一个列表 <br />
GetKeyboardLayoutName 取得当前活动键盘布局的名称 <br />
GetKeyboardState 取得键盘上每个虚拟键当前的状态 <br />
GetKeyboardType 了解与正在使用的键盘有关的信息 <br />
GetKeyNameText 在给出扫描码的前提下，判断键名 <br />
GetKeyState 针对已处理过的按键，在最近一次输入信息时，判断指定虚拟键的状态 <br />
GetLastError 针对之前调用的api函数，用这个函数取得扩展错误信息 <br />
GetLocaleInfo 取得与指定&ldquo;地方&rdquo;有关的信息 <br />
GetLocalTime 取得本地日期和时间 <br />
GetNumberFormat 针对指定的&ldquo;地方&rdquo;，按特定的格式格式化一个数字 <br />
GetOEMCP 判断在OEM和ANSI字符集间转换的windows代码页 <br />
GetQueueStatus 判断应用程序消息队列中待决（等待处理）的消息类型 <br />
GetSysColor 判断指定windows显示对象的颜色 <br />
GetSystemDefaultLangID 取得系统的默认语言ID <br />
GetSystemDefaultLCID 取得当前的默认系统&ldquo;地方&rdquo; <br />
GetSystemInfo 取得与底层硬件平台有关的信息 <br />
GetSystemMetrics 返回与windows环境有关的信息 <br />
GetSystemPowerStatus 获得与当前系统电源状态有关的信息 <br />
GetSystemTime 取得当前系统时间，这个时间采用的是&ldquo;协同世界时间&rdquo;（即UTC，也叫做GMT）格式 <br />
GetSystemTimeAdjustment 使内部系统时钟与一个外部的时钟信号源同步 <br />
GetThreadLocale 取得当前线程的地方ID <br />
GetTickCount 用于获取自windows启动以来经历的时间长度（毫秒） <br />
GetTimeFormat 针对当前指定的&ldquo;地方&rdquo;，按特定的格式格式化一个系统时间 <br />
GetTimeZoneInformation 取得与系统时区设置有关的信息 <br />
GetUserDefaultLangID 为当前用户取得默认语言ID <br />
GetUserDefaultLCID 取得当前用户的默认&ldquo;地方&rdquo;设置 <br />
GetUserName 取得当前用户的名字 <br />
GetVersion 判断当前运行的Windows和DOS版本 <br />
GetVersionEx 取得与平台和操作系统有关的版本信息 <br />
HideCaret 在指定的窗口隐藏插入符（光标） <br />
IsValidCodePage 判断一个代码页是否有效 <br />
IsValidLocale 判断地方标识符是否有效 <br />
keybd_event 这个函数模拟了键盘行动 <br />
LoadKeyboardLayout 载入一个键盘布局 <br />
MapVirtualKey 根据指定的映射类型，执行不同的扫描码和字符转换 <br />
MapVirtualKeyEx 根据指定的映射类型，执行不同的扫描码和字符转换 <br />
MessageBeep 播放一个系统声音。系统声音的分配方案是在控制面板里决定的 <br />
mouse_event 模拟一次鼠标事件 <br />
OemKeyScan 判断OEM字符集中的一个ASCII字符的扫描码和Shift键状态 <br />
OemToChar 将OEM字符集的一个字串转换到ANSI字符集 <br />
SetCaretBlinkTime 指定插入符（光标）的闪烁频率 <br />
SetCaretPos 指定插入符的位置 <br />
SetComputerName 设置新的计算机名 <br />
SetCursor 将指定的鼠标指针设为当前指针 <br />
SetCursorPos 设置指针的位置 <br />
SetDoubleClickTime 设置连续两次鼠标单击之间能使系统认为是双击事件的间隔时间 <br />
SetEnvironmentVariable 将一个环境变量设为指定的值 <br />
SetKeyboardState 设置每个虚拟键当前在键盘上的状态 <br />
SetLocaleInfo 改变用户&ldquo;地方&rdquo;设置信息 <br />
SetLocalTime 设置当前地方时间 <br />
SetSysColors 设置指定窗口显示对象的颜色 <br />
SetSystemCursor 改变任何一个标准系统指针 <br />
SetSystemTime 设置当前系统时间 <br />
SetSystemTimeAdjustment 定时添加一个校准值使内部系统时钟与一个外部的时钟信号源同步 <br />
SetThreadLocale 为当前线程设置地方 <br />
SetTimeZoneInformation 设置系统时区信息 <br />
ShowCaret 在指定的窗口里显示插入符（光标） <br />
ShowCursor 控制鼠标指针的可视性 <br />
SwapMouseButton 决定是否互换鼠标左右键的功能 <br />
SystemParametersInfo 获取和设置数量众多的windows系统参数 <br />
SystemTimeToTzSpecificLocalTime 将系统时间转换成地方时间 <br />
ToAscii 根据当前的扫描码和键盘信息，将一个虚拟键转换成ASCII字符 <br />
ToUnicode 根据当前的扫描码和键盘信息，将一个虚拟键转换成Unicode字符 <br />
UnloadKeyboardLayout 卸载指定的键盘布局 <br />
VkKeyScan 针对Windows字符集中一个ASCII字符，判断虚拟键码和Shift键的状态 <br />
<br />
11. API之进程和线程函数 <br />
<br />
CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 <br />
CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 <br />
ConnectNamedPipe 指示一台服务器等待下去，直至客户机同一个命名管道连接 <br />
CreateEvent 创建一个事件对象 <br />
CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用（收件人） <br />
CreateMutex 创建一个互斥体（MUTEX） <br />
CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 <br />
CreatePipe 创建一个匿名管道 <br />
CreateProcess 创建一个新进程（比如执行一个程序） <br />
CreateSemaphore 创建一个新的信号机 <br />
CreateWaitableTimer 创建一个可等待的计时器对象 <br />
DisconnectNamedPipe 断开一个客户与一个命名管道的连接 <br />
DuplicateHandle 在指出一个现有系统对象当前句柄的情况下，为那个对象创建一个新句柄 <br />
ExitProcess 中止一个进程 <br />
FindCloseChangeNotification 关闭一个改动通知对象 <br />
FindExecutable 查找与一个指定文件关联在一起的程序的文件名 <br />
FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 <br />
FindNextChangeNotification 重设一个文件改变通知对象，令其继续监视下一次变化 <br />
FreeLibrary 释放指定的动态链接库 <br />
GetCurrentProcess 获取当前进程的一个伪句柄 <br />
GetCurrentProcessId 获取当前进程一个唯一的标识符 <br />
GetCurrentThread 获取当前线程的一个伪句柄 <br />
GetCurrentThreadId 获取当前线程一个唯一的线程标识符 <br />
GetExitCodeProces 获取一个已中断进程的退出代码 <br />
GetExitCodeThread 获取一个已中止线程的退出代码 <br />
GetHandleInformation 获取与一个系统对象句柄有关的信息 <br />
GetMailslotInfo 获取与一个邮路有关的信息 <br />
GetModuleFileName 获取一个已装载模板的完整路径名称 <br />
GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 <br />
GetPriorityClass 获取特定进程的优先级别 <br />
GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 <br />
GetProcessTimes 获取与一个进程的经过时间有关的信息 <br />
GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 <br />
GetSartupInfo 获取一个进程的启动信息 <br />
GetThreadPriority 获取特定线程的优先级别 <br />
GetTheardTimes 获取与一个线程的经过时间有关的信息 <br />
GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 <br />
LoadLibrary 载入指定的动态链接库，并将它映射到当前进程使用的地址空间 <br />
LoadLibraryEx 装载指定的动态链接库，并为当前进程把它映射到地址空间 <br />
LoadModule 载入一个Windows应用程序，并在指定的环境中运行 <br />
MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足，则立即返回 <br />
SetPriorityClass 设置一个进程的优先级别 <br />
SetProcessShutdownParameters 在系统关闭期间，为指定进程设置他相对于其它程序的关闭顺序 <br />
SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 <br />
SetThreadPriority 设定线程的优先级别 <br />
ShellExecute 查找与指定文件关联在一起的程序的文件名 <br />
TerminateProcess 结束一个进程 <br />
WinExec 运行指定的程序 <br />
<br />
12. API之控件与消息函数 <br />
<br />
AdjustWindowRect 给定一种窗口样式，计算获得目标客户区矩形所需的窗口大小 <br />
AnyPopup 判断屏幕上是否存在任何弹出式窗口 <br />
ArrangeIconicWindows 排列一个父窗口的最小化子窗口 <br />
AttachThreadInput 连接线程输入函数 <br />
BeginDeferWindowPos 启动构建一系列新窗口位置的过程 <br />
BringWindowToTop 将指定的窗口带至窗口列表顶部 <br />
CascadeWindows 以层叠方式排列窗口 <br />
ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄 <br />
ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标 <br />
CloseWindow 最小化指定的窗口 <br />
CopyRect 矩形内容复制 <br />
DeferWindowPos 该函数为特定的窗口指定一个新窗口位置 <br />
DestroyWindow 清除指定的窗口以及它的所有子窗口 <br />
DrawAnimatedRects 描绘一系列动态矩形 <br />
EnableWindow 指定的窗口里允许或禁止所有鼠标及键盘输入 <br />
EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置及状态 <br />
EnumChildWindows 为指定的父窗口枚举子窗口 <br />
EnumThreadWindows 枚举与指定任务相关的窗口 <br />
EnumWindows 枚举窗口列表中的所有父窗口 <br />
EqualRect 判断两个矩形结构是否相同 <br />
FindWindow 寻找窗口列表中第一个符合指定条件的顶级窗口 <br />
FindWindowEx 在窗口列表中寻找与指定条件相符的第一个子窗口 <br />
FlashWindow 闪烁显示指定窗口 <br />
GetActiveWindow 获得活动窗口的句柄 <br />
GetCapture 获得一个窗口的句柄，这个窗口位于当前输入线程，且拥有鼠标捕获（鼠标活动由它接收） <br />
GetClassInfo 取得WNDCLASS结构（或WNDCLASSEX结构）的一个副本，结构中包含了与指定类有关的信息 <br />
GetClassLong 取得窗口类的一个Long变量条目 <br />
GetClassName 为指定的窗口取得类名 <br />
GetClassWord 为窗口类取得一个整数变量 <br />
GetClientRect 返回指定窗口客户区矩形的大小 <br />
GetDesktopWindow 获得代表整个屏幕的一个窗口（桌面窗口）句柄 <br />
GetFocus 获得拥有输入焦点的窗口的句柄 <br />
GetForegroundWindow 获得前台窗口的句柄 <br />
GetLastActivePopup 获得在一个给定父窗口中最近激活过的弹出式窗口的句柄 <br />
GetParent 判断指定窗口的父窗口 <br />
GetTopWindow 搜索内部窗口列表，寻找隶属于指定窗口的头一个窗口的句柄 <br />
GetUpdateRect 获得一个矩形，它描叙了指定窗口中需要更新的那一部分 <br />
GetWindow 获得一个窗口的句柄，该窗口与某源窗口有特定的关系 <br />
GetWindowContextHelpId 取得与窗口关联在一起的帮助场景ID <br />
GetWindowLong 从指定窗口的结构中取得信息 <br />
GetWindowPlacement 获得指定窗口的状态及位置信息 <br />
GetWindowRect 获得整个窗口的范围矩形，窗口的边框、标题栏、滚动条及菜单等都在这个矩形内 <br />
GetWindowText 取得一个窗体的标题（caption）文字，或者一个控件的内容 <br />
GetWindowTextLength 调查窗口标题文字或控件内容的长短 <br />
GetWindowWord 获得指定窗口结构的信息 <br />
InflateRect 增大或减小一个矩形的大小 <br />
IntersectRect 这个函数在lpDestRect里载入一个矩形，它是lpSrc1Rect与lpSrc2Rect两个矩形的交集 <br />
InvalidateRect 屏蔽一个窗口客户区的全部或部分区域 <br />
IsChild 判断一个窗口是否为另一窗口的子或隶属窗口 <br />
IsIconic 判断窗口是否已最小化 <br />
IsRectEmpty 判断一个矩形是否为空 <br />
IsWindow 判断一个窗口句柄是否有效 <br />
IsWindowEnabled 判断窗口是否处于活动状态 <br />
IsWindowUnicode 判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收Unicode文字 <br />
IsWindowVisible 判断窗口是否可见 <br />
IsZoomed 判断窗口是否最大化 <br />
LockWindowUpdate 锁定指定窗口，禁止它更新 <br />
MapWindowPoints 将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统 <br />
MoveWindow 改变指定窗口的位置和大小 <br />
OffsetRect 通过应用一个指定的偏移，从而让矩形移动起来 <br />
OpenIcon 恢复一个最小化的程序，并将其激活 <br />
PtInRect 判断指定的点是否位于矩形内部 <br />
RedrawWindow 重画全部或部分窗口 <br />
ReleaseCapture 为当前的应用程序释放鼠标捕获 <br />
ScreenToClient 判断屏幕上一个指定点的客户区坐标 <br />
ScrollWindow 滚动窗口客户区的全部或一部分 <br />
ScrollWindowEx 根据附加的选项，滚动窗口客户区的全部或部分 <br />
SetActiveWindow 激活指定的窗口 <br />
SetCapture 将鼠标捕获设置到指定的窗口 <br />
SetClassLong 为窗口类设置一个Long变量条目 <br />
SetClassWord 为窗口类设置一个条目 <br />
SetFocusAPI 将输入焦点设到指定的窗口。如有必要，会激活窗口 <br />
SetForegroundWindow 将窗口设为系统的前台窗口 <br />
SetParent 指定一个窗口的新父 <br />
SetRect 设置指定矩形的内容 <br />
SetRectEmpty 将矩形设为一个空矩形 <br />
SetWindowContextHelpId 为指定的窗口设置帮助场景（上下文）ID <br />
SetWindowLong 在窗口结构中为指定的窗口设置信息 <br />
SetWindowPlacement 设置窗口状态和位置信息 <br />
SetWindowPos 为窗口指定一个新位置和状态 <br />
SetWindowText 设置窗口的标题文字或控件的内容 <br />
SetWindowWord 在窗口结构中为指定的窗口设置信息 <br />
ShowOwnedPopups 显示或隐藏由指定窗口所有的全部弹出式窗口 <br />
ShowWindow 控制窗口的可见性 <br />
ShowWindowAsync 与ShowWindow相似 <br />
SubtractRect 装载矩形lprcDst，它是在矩形lprcSrc1中减去lprcSrc2得到的结果 <br />
TileWindows 以平铺顺序排列窗口 <br />
UnionRect 装载一个lpDestRect目标矩形，它是lpSrc1Rect和lpSrc2Rect联合起来的结果 <br />
UpdateWindow 强制立即更新窗口 <br />
ValidateRect 校验窗口的全部或部分客户区 <br />
WindowFromPoint 返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口</p>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/134473#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Oct 2007 16:10:54 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/134473</link>
        <guid>http://hanxinyu.javaeye.com/blog/134473</guid>
      </item>
      <item>
        <title>CPU 64位技术</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/131621" style="color:red;">http://hanxinyu.javaeye.com/blog/131621</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          64位技术：这里的64位技术是相对于32位而言的，这个位数指的是CPU GPRs（General-Purpose Registers，通用寄存器）的数据宽度为64位，64位指令集就是运行64位数据的指令，也就是说处理器一次可以运行64bit数据。64bit处理器并非现在才有的，在高端的RISC（Reduced Instruction Set Computing，精简指令集计算机）很早就有64bit处理器了，比如SUN公司的UltraSparc Ⅲ、IBM公司的POWER5、HP公司的Alpha等。 <br />
<br />
64bit计算主要有两大优点：可以进行更大范围的整数运算；可以支持更大的内存。不能因为数字上的变化，而简单的认为64bit处理器的性能是32bit处理器性能的两倍。实际上在32bit应用下，32bit处理器的性能甚至会更强，即使是64bit处理器，目前情况下也是在32bit应用下性能更强。所以要认清64bit处理器的优势，但不可迷信64bit。 <br />
<br />
要实现真正意义上的64位计算，光有64位的处理器是不行的，还必须得有64位的操作系统以及64位的应用软件才行，三者缺一不可，缺少其中任何一种要素都是无法实现64位计算的。目前，在64位处理器方面，Intel和AMD两大处理器厂商都发布了多个系列多种规格的64位处理器；而在操作系统和应用软件方面，目前的情况不容乐观。因为真正适合于个人使用的64位操作系统现在就只有Windows XP X64，而Windows XP X64本身也只是一个过渡性质的64位操作系统，在Windows Vista发布以后就将被淘汰，而且Windows XP X64本身也不太完善，易用性不高，一个明显的例子就是各种硬件设备的驱动程序很不完善，而且现在64位的应用软件还基本上没有，确实硬件厂商和软件厂商也不愿意去为一个过渡性质的操作系统编写驱动程序和应用软件。所以要想实现真正的64位计算，恐怕还得等到Windows Vista普及一段时间之后才行。 <br />
<br />
目前主流CPU使用的64位技术主要有AMD公司的AMD64位技术、Intel公司的EM64T技术、和Intel公司的IA-64技术。其中IA-64是Intel独立开发，不兼容现在的传统的32位计算机，仅用于Itanium（安腾）以及后续产品Itanium 2，一般用户不会涉及到，因此这里仅对AMD64位技术和Intel的EM64T技术做一下简单介绍。 <br />
<br />
AMD64位技术X86-64：<br />
AMD64的位技术是在原始32位X86指令集的基础上加入了X86-64扩展64位X86指令集，使这款芯片在硬件上兼容原来的32位X86软件，并同时支持X86-64的扩展64位计算，使得这款芯片成为真正的64位X86芯片。这是一个真正的64位的标准，X86-64具有64位的寻址能力。 <br />
<br />
X86-64新增的几组CPU寄存器将提供更快的执行效率。寄存器是CPU内部用来创建和储存CPU运算结果和其它运算结果的地方。标准的32-bit x86架构包括8个通用寄存器（GPR），AMD在X86-64中又增加了8组（R8-R9），将寄存器的数目提高到了16组。X86-64寄存器默认位64-bit。还增加了8组128-bit XMM寄存器（也叫SSE寄存器，XMM8-XMM15），将能给单指令多数据流技术（SIMD）运算提供更多的空间，这些128位的寄存器将提供在矢量和标量计算模式下进行128位双精度处理，为3D建模、矢量分析和虚拟现实的实现提供了硬件基础。通过提供了更多的寄存器，按照X86-64标准生产的CPU可以更有效的处理数据，可以在一个时钟周期中传输更多的信息。
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/131621#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 13 Oct 2007 10:33:56 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/131621</link>
        <guid>http://hanxinyu.javaeye.com/blog/131621</guid>
      </item>
      <item>
        <title>BI项目中ETL设计与思考</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/130029" style="color:red;">http://hanxinyu.javaeye.com/blog/130029</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font color="#006699">ETL即数据抽取（Extract）、转换（Transform）、装载（Load）的过程，它是构建数据仓库的重要环节。</font>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程，目的是将企业中的分散、零乱、标准不统一的数据整合到一起，为企业的决策提供分析依据。ETL是<a href="http://it.mie168.com/BI/index.htm" title="bis,BI,智能系统,商业智能" target="_blank">BI</a>项目重要的一个环节。通常情况下，在BI项目中ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败。</p>
<p>　　ETL的设计分三部分：数据抽取、数据的清洗转换、数据的加载。在设计ETL的时候我们也是从这三部分出发。数据的抽取是从各个不同的数据源抽取到ODS(OperationalDataStore，操作型<a href="http://it.mie168.com/DSM/index.htm" title="dsm,数据存储,数据库,数据挖掘" target="_blank">数据存储</a>)中&mdash;&mdash;这个过程也可以做一些数据的清洗和转换)，在抽取的过程中需要挑选不同的抽取方法，尽可能的提高ETL的运行效率。ETL三个部分中，花费时间最长的是&ldquo;T&rdquo;(Transform，清洗、转换)的部分，一般情况下这部分工作量是整个ETL的2/3。数据的加载一般在数据清洗完了之后直接写入DW(DataWarehousing，数据仓库)中去。</p>
<p>　　ETL的实现有多种方法，常用的有三种。一种是借助ETL工具(如<a href="http://it.mie168.com/qiye/oracle" title="oracle,甲骨文,Oracle" target="_blank">Oracle</a>的OWB、SQLServer2000的DTS、SQLServer2005的SSIS服务、Informatic等)实现，一种是SQL方式实现，另外一种是ETL工具和SQL相结合。前两种方法各有各的优缺点，借助工具可以快速的建立起ETL工程，屏蔽了复杂的编码任务，提高了速度，降低了难度，但是缺少灵活性。SQL的方法优点是灵活，提高ETL运行效率，但是编码复杂，对技术要求比较高。第三种是综合了前面二种的优点，会极大地提高ETL的开发速度和效率。</p>
<p>　　<strong>一、数据的抽取</strong></p>
<p>　　这一部分需要在调研阶段做大量的工作，首先要搞清楚数据是从几个业务系统中来,各个业务系统的数据库服务器运行什么DBMS,是否存在手工数据，手工数据量有多大，是否存在非结构化的数据等等，当收集完这些信息之后才可以进行数据抽取的设计。</p>
<p>　　1、对于与存放DW的数据库系统相同的数据源处理方法</p>
<p>　　这一类数据源在设计上比较容易。一般情况下，DBMS(SQLServer、Oracle)都会提供数据库链接功能，在DW数据库服务器和原业务系统之间建立直接的链接关系就可以写Select语句直接访问。</p>
<p>　　2、对于与DW数据库系统不同的数据源的处理方法</p>
<p>　　对于这一类数据源，一般情况下也可以通过ODBC的方式建立数据库链接&mdash;&mdash;如SQLServer和Oracle之间。如果不能建立数据库链接，可以有两种方式完成，一种是通过工具将源数据导出成.txt或者是.xls文件，然后再将这些源系统文件导入到ODS中。另外一种方法是通过程序接口来完成。</p>
<p>　　3、对于文件类型数据源(.txt,.xls)，可以<a href="http://mie168.com/human-resource/peixunfazhan.htm" title="peixun,培训" target="_blank">培训</a>业务人员利用数据库工具将这些数据导入到指定的数据库，然后从指定的数据库中抽取。或者还可以借助工具实现，如SQLServer2005的SSIS服务的平面数据源和平面<a href="http://mie168.com/manage/zuzhi-mubiao.htm" title="zuzhi-mubiao,组织,目标" target="_blank">目标</a>等组件导入ODS中去。</p>
<p>　　4、增量更新的问题</p>
<p>　　对于数据量大的系统，必须考虑增量抽取。一般情况下，业务系统会记录业务发生的时间，我们可以用来做增量的标志,每次抽取之前首先判断ODS中记录最大的时间，然后根据这个时间去业务系统取大于这个时间所有的记录。利用业务系统的时间戳，一般情况下，业务系统没有或者部分有时间戳。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>二、数据的清洗转换</strong></p>
<p>　　一般情况下，数据仓库分为ODS、DW两部分。通常的做法是从业务系统到ODS做清洗，将脏数据和不完整数据过滤掉，在从ODS到DW的过程中转换，进行一些业务规则的计算和聚合。</p>
<p>&nbsp;&nbsp;&nbsp; 1、数据清洗</p>
<p>　　数据清洗的任务是过滤那些不符合要求的数据，将过滤的结果交给业务主管部门，确认是否过滤掉还是由业务单位修正之后再进行抽取。不符合要求的数据主要是有不完整的数据、错误的数据、重复的数据三大类。</p>
<p>　　(1)不完整的数据：这一类数据主要是一些应该有的信息缺失，如<a href="http://mie168.com/zhuanti/gongyingshang.htm" title="gongyingshang,供应商" target="_blank">供应商</a>的名称、分公司的名称、客户的区域信息缺失、业务系统中主表与明细表不能匹配等。对于这一类数据过滤出来，按缺失的内容分别写入不同Excel文件向客户提交，要求在规定的时间内补全。补全后才写入数据仓库。</p>
<p>　　(2)错误的数据：这一类错误产生的原因是业务系统不够健全，在接收输入后没有进行判断直接写入后台数据库造成的，比如数值数据输成全角数字字符、字符串数据后面有一个回车操作、日期格式不正确、日期越界等。这一类数据也要分类，对于类似于全角字符、数据前后有不可见字符的问题，只能通过写SQL语句的方式找出来，然后要求客户在业务系统修正之后抽取。日期格式不正确的或者是日期越界的这一类错误会导致ETL运行失败，这一类错误需要去业务系统数据库用SQL的方式挑出来，交给业务主管部门要求限期修正，修正之后再抽取。</p>
<p>　　(3)重复的数据：对于这一类数据&mdash;&mdash;特别是维表中会出现这种情况&mdash;&mdash;将重复数据记录的所有字段导出来，让客户确认并整理。</p>
<p>　　数据清洗是一个反复的过程，不可能在几天内完成，只有不断的发现问题，解决问题。对于是否过滤，是否修正一般要求客户确认，对于过滤掉的数据，写入Excel文件或者将过滤数据写入数据表，在ETL开发的初期可以每天向业务单位发送过滤数据的邮件，促使他们尽快地修正错误,同时也可以做为将来验证数据的依据。数据清洗需要注意的是不要将有用的数据过滤掉，对于每个过滤规则认真进行验证，并要用户确认。</p>
<p>　　2、数据转换</p>
<p>　　数据转换的任务主要进行不一致的数据转换、数据粒度的转换，以及一些商务规则的计算。</p>
<p>　　(1)不一致数据转换：这个过程是一个整合的过程，将不同业务系统的相同类型的数据统一，比如同一个供应商在结算系统的编码是XX0001,而在<a href="http://it.mie168.com/crm" title="crm,CRM,客户资源,客户关系管理" target="_blank">CRM</a>中编码是YY0001，这样在抽取过来之后统一转换成一个编码。</p>
<p>　　(2)数据粒度的转换：业务系统一般存储非常明细的数据，而数据仓库中数据是用来分析的，不需要非常明细的数据。一般情况下，会将业务系统数据按照数据仓库粒度进行聚合。</p>
<p>　　(3)商务规则的计算：不同的企业有不同的业务规则、不同的数据指标，这些指标有的时候不是简单的加加减减就能完成，这个时候需要在ETL中将这些数据指标计算好了之后存储在数据仓库中，以供分析使用。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>三、ETL日志、警告发送</strong></p>
<p>　　1、ETL日志</p>
<p>　　ETL日志分为三类。一类是执行过程日志，这一部分日志是在ETL执行过程中每执行一步的记录，记录每次运行每一步骤的起始时间，影响了多少行数据，流水账形式。一类是错误日志，当某个模块出错的时候写错误日志，记录每次出错的时间、出错的模块以及出错的信息等。第三类日志是总体日志，只记录ETL开始时间、结束时间是否成功信息。如果使用ETL工具,ETL工具会自动产生一些日志，这一类日志也可以作为ETL日志的一部分。记录日志的目的是随时可以知道ETL运行情况，如果出错了，可以知道哪里出错。</p>
<p>　　2、警告发送</p>
<p>　　如果ETL出错了，不仅要形成ETL出错日志，而且要向系统管理员发送警告。发送警告的方式多种，一般常用的就是给系统管理员发送邮件，并附上出错的信息，方便管理员排查错误。</p>
<p>　　ETL是BI项目的关键部分，也是一个长期的过程，只有不断的发现问题并解决问题，才能使ETL运行效率更高，为BI项目后期开发提供准确的数据。<br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/130029#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 11:15:40 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/130029</link>
        <guid>http://hanxinyu.javaeye.com/blog/130029</guid>
      </item>
      <item>
        <title>常用oracle操作(三)</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/129759" style="color:red;">http://hanxinyu.javaeye.com/blog/129759</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">杀掉oracle进程：alter system kill session 'sid,serial#';</font></p>
<p><font face="Arial">--从数据库段中获得段名为TB_DW_SC_USER_CUR的所有的分区名以及他们的容量大小<br />
select partition_name,bytes/1024/1024 from dba_segments where segment_name='TB_DW_SC_USER_CUR' <br />
&nbsp;order by 1;<br />
&nbsp;<br />
select * from v$open_cursor where sid = :sid;</font></p>
<p><font face="Arial">select&nbsp;&nbsp; value from&nbsp;&nbsp;&nbsp;&nbsp; v$sesstat<br />
where&nbsp;&nbsp;&nbsp; sid = :sid<br />
order by statistic#;<br />
select l.*, o.owner object_owner, o.object_Name<br />
from&nbsp; sys.all_objects o, v$lock l<br />
where l.sid = :sid and l.type = 'TM' and o.object_id = l.id1</font></p>
<p><font face="Arial">alter session set current_schema=rene;<br />
##################################<br />
##会话相关,从会话找到对应的unix进程号及正在执行的sql语句<br />
##################################<br />
Select&nbsp; sid,serial#,program ,logon_time,username,osuser<br />
&nbsp;From v$session<br />
&nbsp;Where 1=1 <br />
&nbsp;-- and program Like 'sql%'<br />
&nbsp;-- and username = 'HW_QUERY'<br />
&nbsp;-- And logon_time&lt;sysdate-5/60<br />
&nbsp;and osuser ='hwuser'<br />
&nbsp;order by 3,4<br />
&nbsp;;<br />
Select paddr,sql_address From v$session <br />
&nbsp;Where sid =932;<br />
&nbsp;paddr='07000001371FC968'<br />
SELECT spid<br />
&nbsp; FROM v$process<br />
&nbsp;WHERE (addr = '07000003F52BFF68');</font></p>
<p><font face="Arial">SELECT&nbsp;&nbsp; hash_value,sql_text<br />
&nbsp;&nbsp;&nbsp; FROM v$sqltext_with_newlines<br />
&nbsp;&nbsp; WHERE hash_value = TO_NUMBER (:HASH)<br />
ORDER BY piece</font></p>
<p><font face="Arial">select SQL_FULLTEXT from v$sqlarea_plan_hash t Where t.ADDRESS='07000003E1DD6818'<br />
&nbsp;v$sqlarea</font></p>
<p><font face="Arial">Select p.spid,s.sid,s.serial#,s.username,s.program ,s.logon_time From v$session s,v$process p<br />
&nbsp;Where s.paddr =p.addr<br />
&nbsp;order by 4,5;</font></p>
<p><font face="Arial">##################################<br />
##会话相关,spid====&gt;sqltext<br />
##################################</font></p>
<p><font face="Arial">--人v$process找到session的地址<br />
SELECT addr,spid<br />
&nbsp; FROM v$process<br />
&nbsp;WHERE (spid= 296118);<br />
&nbsp;--找当前执行的sql及前一sql的地址<br />
Select sql_address,prev_sql_addr,sid,serial#,paddr From v$session Where <br />
&nbsp;paddr='07000004EC287A80';<br />
--从sql_address找语句<br />
select sql_fulltext from v$sqlarea_plan_hash t Where t.ADDRESS='07000004DB478478';</font></p>
<p><font face="Arial">select sid,serial#,paddr,sql_address,program,logon_time from v$session<br />
where program like 'sqlpl%'<br />
and sql_address &lt;&gt;'00';</font></p>
<p><font face="Arial">##################################<br />
#被锁定的对象<br />
##################################<br />
select o.owner,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.object_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.sid,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.serial#,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- lo.xidusn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- lo.xidslot,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- lo.xidsqn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- lo.session_id,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --lo.oracle_username,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- lo.os_user_name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --lo.process,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --lo.locked_mode,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --s.machine,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --s.status,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --s.server,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.program&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
from all_objects o,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; v$locked_object lo,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; sys.gv_$session s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
where ( o.object_id = lo.object_id ) <br />
and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( lo.process = s.process ) <br />
-- and s.sid=1013<br />
order by object_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
;<br />
--EXPLAIN PLAN <br />
EXPLAIN PLAN <br />
&nbsp;&nbsp;&nbsp; SET STATEMENT_ID = 'pxs' <br />
&nbsp;&nbsp;&nbsp; INTO plan_table <br />
&nbsp;&nbsp;&nbsp; FOR <br />
&nbsp;<br />
&nbsp;; <br />
column OPERATION format a48 <br />
column options format a32 <br />
&nbsp;<br />
SELECT LPAD(' ',2*(LEVEL-1))||operation operation, options, <br />
object_name, position <br />
&nbsp;&nbsp;&nbsp; FROM plan_table <br />
&nbsp;&nbsp;&nbsp; START WITH id = 0 AND statement_id = 'pxs'<br />
&nbsp;&nbsp;&nbsp; CONNECT BY PRIOR id = parent_id AND <br />
&nbsp;&nbsp;&nbsp; statement_id = 'pxs'; </font></p>
<p><font face="Arial">222120<br />
--查看数据分区情况<br />
select partition_name,bytes/1024/1024 from dba_segments where segment_name = upper('tb_mk_user_last_call_day')</font></p>
<p><font face="Arial">$ORACLE_HOME/sqlplus/admin/glogin.sql<br />
##################################<br />
--周处理<br />
to_char(start_date,'ww')--年内周<br />
to_char(start_date,'w') --月内周<br />
##################################<br />
#空间相关<br />
##################################</font></p>
<p><font face="Arial">--查看空间占用<br />
select tablespace_name,round(sum(bytes)/1024/1024/1024) as &quot;free(G)&quot;<br />
from dba_free_space <br />
group by tablespace_name<br />
order by 1; </font></p>
<p><font face="Arial">--查看表空间的名称及大小 <br />
column db_name format a10<br />
select sys_context ('USERENV', 'db_name') db_name,t.tablespace_name,round(sum(bytes/(1024*1024*1024)),0) &quot;ts_size(G)&quot;<br />
from sys.dba_tablespaces t, sys.dba_data_files d <br />
where t.tablespace_name = d.tablespace_name <br />
group by t.tablespace_name<br />
order by 2; </font></p>
<p><font face="Arial">--dba_segments 数据块字典<br />
select segment_name,tablespace_name,bytes/1024/1024<br />
&nbsp;from dba_segments t1 ,<br />
('TB_MK_CL_DOWNLOAD_WEEK','TB_MK_NS_SERVICE_WEEK','TB_MK_SC_OPP_USER_WEEK','TB_MK_SC_USER_CELL_WEEK_TEN','TB_MK_SC_USER_PLUS_WEEK','TB_MK_SC_USER_WEEK')<br />
;</font></p>
<p><font face="Arial">##################################<br />
#权限角色相关<br />
##################################</font></p>
<p><font face="Arial">#数据库中定义的角色<br />
SELect * from dba_role_privs where GRANTED_ROLE='DBA' order by 1,2;<br />
#角色具有的权限<br />
SELect * from dba_sys_privs where grantee ='BIM' order by 1,2;<br />
#表空间使用份额<br />
select * from dba_ts_quotas;<br />
#分区配置表的关键参数,bim用户下对dw/mk/kr的tb_sys_tab_partitions 做了个union all的视图<br />
select table_name,partition_name,tablespace_name,partition_count,PARTITION_TYPE_ID,deal_cycle,TABLESPACE_TYPE_ID,partition_count <br />
--select * <br />
from tb_sys_tab_partitions <br />
where table_name in('TB_DW_CL_SHDPAY_CUR','TB_DW_CL_GROUP_PERSON_CUR_H','TB_DW_CL_SHDPAY_CUR');</font></p>
<p><font face="Arial">update dgdm_dw.tb_sys_tab_partitions set PARTITION_TYPE_ID='L' where table_name ='TB_DW_CL_GROUP_PERSON_CUR_H';</font></p>
<p><font face="Arial">##################################<br />
#分区相关<br />
##################################<br />
#新增没有配置的分区表<br />
select owner,segment_name from dba_segments <br />
&nbsp;where segment_type='TABLE PARTITION' and owner like 'DGDM%' and owner not like '%ODS'<br />
MINUS<br />
select owner,table_name from tb_sys_tab_partitions;</font></p>
<p><font face="Arial">#分区表数据字典,查找分区类型<br />
select table_name,partitioning_type,partitioning_type<br />
from dba_part_tables <br />
where table_name in('TB_DW_CL_SHDPAY_CUR','TB_DW_CL_GROUP_PERSON_CUR_H','TB_DW_CL_SHDPAY_CUR');<br />
#分区字段字典.<br />
select * from dba_part_key_columns;<br />
--表分区字典<br />
--select table_name,partition_name,compression from dba_tab_partitions where table_name like 'TB_MK%' and rownum&lt;5;<br />
select table_owner,table_name,partition_name,compression from dba_tab_partitions <br />
&nbsp;where table_name like 'TB\_%' escape '\'<br />
&nbsp;and compression&lt;&gt;'ENABLED'<br />
&nbsp;and table_owner in ('DGDM_DW','DGDM_MK','DGDM_KR');</font></p>
<p><font face="Arial"># 分区表的默认表空间,前段困扰我们的masa表空间不足的罪魁祸首<br />
Select table_name, def_tablespace_name From all_part_tables&nbsp; Where (substr(def_tablespace_name,-1) &lt;&gt;'0') And TABLE_NAME Like 'TB_DW%';<br />
Select 'alter table&nbsp; dgdm_dw.'||table_name|| ' modify default attributes tablespace tbs_data_0;' def_tablespace_name From all_part_tables&nbsp; <br />
Where 0=0<br />
&nbsp;--and (substr(def_tablespace_name,-1) &lt;&gt;'0') <br />
&nbsp;And TABLE_NAME Like 'TB_DW%' <br />
&nbsp;and def_tablespace_name ='TBS_DW_CUST_DATA_0';<br />
#更改分区表的默认表空间<br />
alter table test_part modify default attributes tablespace test03;</font></p>
<p><font face="Arial">##################################<br />
#用sql语句生成脚本然后拷贝到sqlplus中执行是一种很常用的技巧.<br />
##################################<br />
select 'alter table '||table_owner||'.'||table_name ||' move partition '||partition_name||' compress;' <br />
&nbsp;from dba_tab_partitions <br />
&nbsp;where table_name like 'TB_MK%' <br />
&nbsp; and compression &lt;&gt;'ENABLED' <br />
&nbsp; and table_name like 'TB_MK%';</font></p>
<p><font face="Arial">select 'alter table '||table_owner||'.'||table_name||' move partition '||partition_name||' compress;' <br />
select sys_context ('USERENV', 'db_name') db_name,table_owner,table_name,partition_name,compression<br />
from dba_tab_partitions <br />
where&nbsp; 1=1<br />
and table_name like 'TB____%' <br />
and compression ='DISABLED'<br />
and table_owner like 'DGDM%'<br />
;</font></p>
<p><font face="Arial">##################################<br />
#日志<br />
##################################<br />
column table_name format a32 <br />
column task_name format a32 <br />
column task_log format a60<br />
column task_pos format a60<br />
column task_sign format a60<br />
select&nbsp; task_sign,start_time,end_time,task_name,table_name ,task_log<br />
from --dgdm_dw.tb_dw_sys_log<br />
&nbsp; (<br />
&nbsp;&nbsp; select * from gddm_cb.tb_cb_sys_log<br />
&nbsp;&nbsp; union all<br />
&nbsp;&nbsp; select * from dgdm_ods.tb_in_sys_log<br />
&nbsp;&nbsp; union all<br />
&nbsp;&nbsp; select * from dgdm_dw.tb_dw_sys_log<br />
&nbsp;&nbsp; union all<br />
&nbsp;&nbsp; select * from dgdm_mk.tb_mk_sys_log<br />
&nbsp;&nbsp; union all<br />
&nbsp;&nbsp; select * from dgdm_kr.tb_kr_sys_log<br />
&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp; <br />
where 1=1<br />
&nbsp;and start_time&gt;sysdate-1<br />
&nbsp;and table_name like 'tb_kr_data_service_mon'<br />
&nbsp;-- and instr( task_log ,'ORA-')&gt;0<br />
&nbsp;order by 1 ;</font></p>
<font face="Arial">
<p><br />
#表空间中的对象<br />
select segment_name from dba_segments where partition_name like '%200706%' and tablespace_name='TBS_MK_FACT_DATA_5';</p>
<p>#分区大小<br />
select owner,segment_name,partition_name,tablespace_name,bytes/1024/1024 <br />
&nbsp;from dba_segments <br />
&nbsp;where 1=1<br />
&nbsp; --and segment_name='TB_DW_PD_USR_MARKPLAN'<br />
&nbsp; and tablespace_name='TBS_DATA_H6'<br />
&nbsp;order by 1,2,3;</p>
<p>#周表月份核对<br />
--周表<br />
&nbsp;select tablespace_name,owner,segment_name,partition_name,segment_type,bytes/1024/1024<br />
&nbsp;,(select to_char(end_date,'m') from gddm_cb.tb_dic_week t2 where t2.STATIS_WEEK= substr(partition_name,instr(partition_name,'_',-1)+5,2)),substr(tablespace_name,-1) wm,<br />
&nbsp;(select tablespace_name from tb_sys_tab_partitions tt where tt.table_name=t1.segment_name) ts<br />
&nbsp;,<br />
&nbsp;from dba_segments t1<br />
&nbsp;where SEGMENT_TYPE='TABLE PARTITION' <br />
&nbsp;and segment_name like '%WEEK%'<br />
&nbsp;and length(substr(partition_name,instr(partition_name,'_',-1)+1))=6<br />
&nbsp;and owner like 'DGDM%' and owner not like '%ODS'<br />
ORDER BY segment_name,partition_name;</p>
<p>--普通表<br />
select tablespace_name,owner,segment_name,partition_name,segment_type,bytes/1024/1024<br />
&nbsp;,substr(partition_name,instr(partition_name,'_',-1)+5,2),substr(tablespace_name,-1),<br />
&nbsp;(select tablespace_name from tb_sys_tab_partitions ta where ta.table_name= t1.segment_name)||'_'<br />
&nbsp;from dba_segments&nbsp; t1<br />
&nbsp;where SEGMENT_TYPE='TABLE PARTITION' <br />
&nbsp; --and substr(partition_name,instr(partition_name,'_',-1)+5,2) - substr(tablespace_name,-1) not in (0,6)<br />
&nbsp; and segment_name not like '%WEEK'<br />
&nbsp; and owner ='DGDM_MK'<br />
&nbsp;ORDER BY segment_name,partition_name;</p>
<p>##################################<br />
#表空间整理<br />
##################################</p>
<p>select T1.owner,T1.segment_name,T1.partition_name,T1.bytes/1024/1024 MB,t1.tablespace_name<br />
,t1.segment_type<br />
,(SELECT TABLESPACE_NAME FROM TB_SYS_TAB_PARTITIONS T2 WHERE T1.SEGMENT_NAME= T2.TABLE_NAME) <br />
,substr(partition_name,instr(partition_name,'_',-1)+5,2)<br />
,SYS_CONTEXT ('USERENV', 'db_name') db_name<br />
from dba_segments T1 <br />
where 1=1<br />
and tablespace_name LIKE'TBS_KR_DATA_1%'<br />
--and partition_name like '%200708%'<br />
-- and segment_type='TABLE PARTITION'<br />
&nbsp;-- and segment_name in (<br />
-- 'TB_KR_SC_USER_DAY'<br />
-- )<br />
-- and segment_name not like 'TB_MK_LS%'<br />
--and segment_name in (select table_name from tb_sys_tab_partitions where table_name like '%MK%MID') <br />
and segment_name not in ('TB_MK_CL_DOWNLOAD_WEEK','TB_MK_NS_SERVICE_WEEK','TB_MK_SC_OPP_USER_WEEK','TB_MK_SC_USER_CELL_WEEK_TEN','TB_MK_SC_USER_PLUS_WEEK','TB_MK_SC_USER_WEEK')<br />
--and owner like 'DGDM%'<br />
--and T1.bytes/1024/1024 between 1 and 32 <br />
order by 1,2,3;</p>
<p><br />
update dgdm_mk.tb_sys_tab_partitions set tablespace_name='TBS_MK_FACT_DATA' <br />
&nbsp;where tablespace_name&nbsp; in('TBS_DW_RES_DATA'<br />
-- ,'TBS_DW_DATA_FUNC'<br />
-- ,'TBS_DW_CUST_DATA_H'<br />
-- ,'TBS_DW_CUST_DATA'<br />
&nbsp;);<br />
&nbsp;update dgdm_dw.tb_sys_tab_partitions set tablespace_name='TBS_DW_AC_DATA' <br />
&nbsp;where tablespace_name&nbsp; in('TBS_DW_RES_DATA'<br />
-- ,'TBS_DW_DATA_FUNC'<br />
-- ,'TBS_DW_CUST_DATA_H'<br />
&nbsp;--,'TBS_DW_CUST_DATA'<br />
&nbsp;);<br />
&nbsp;<br />
update dgdm_mk.tb_sys_tab_partitions set tablespace_name='TBS_MK_FACT_DATA' where table_name<br />
IN(<br />
'TB_MK_SC_USER_CELL_WEEK_TEN'<br />
,'TB_MK_SC_USER_DAY'<br />
,'TB_MK_SC_USER_DTAL'<br />
);</p>
<p>select segment_name,partition_name,bytes/1024/1024 from dba_segments where segment_name in (select table_name from tb_sys_tab_partitions where tablespace_name ='TBS_DATA_H') order by 1,2;</p>
<p>select&nbsp; T1.owner,T1.segment_name,T1.partition_name,T1.bytes/1024/1024 MB,t1.tablespace_name<br />
,t1.segment_type<br />
,(SELECT TABLESPACE_NAME FROM TB_SYS_TAB_PARTITIONS T2 WHERE T1.SEGMENT_NAME= T2.TABLE_NAME) <br />
&nbsp;from dba_segments t1 ,tb_sys_tab_partitions t2<br />
&nbsp; where t1.segment_name= t2.table_name<br />
&nbsp; and t1.partition_name like '%200707%'<br />
&nbsp; and t1.tablespace_name not like t2.tablespace_name||'%'<br />
&nbsp; and segment_name not in ('TB_MK_CL_DOWNLOAD_WEEK','TB_MK_NS_SERVICE_WEEK','TB_MK_SC_OPP_USER_WEEK','TB_MK_SC_USER_CELL_WEEK_TEN','TB_MK_SC_USER_PLUS_WEEK','TB_MK_SC_USER_WEEK');</p>
<p>select SYS_CONTEXT ('USERENV', 'db_name') db_name,'JUN',t2.tablespace_name,round(sum(t1.bytes)/1024/1024/1024 )<br />
&nbsp; from dba_segments t1,tb_sys_tab_partitions t2<br />
&nbsp; where 1=1<br />
&nbsp;&nbsp; and t1.segment_name= t2.table_name<br />
&nbsp;&nbsp; and t1.partition_name like '%200706%'<br />
&nbsp;and t2.owner&lt;&gt;'DGDM_ODS'<br />
&nbsp; group by t2.tablespace_name<br />
&nbsp; order by 1,2,3;</p>
<p>alter table dgdm_mk.TB_DIC_TEL_PHONE_SEGMENT move tablespace tbs_etl_data storage( initial 8k);</p>
<p>ALTER TABLE DGDM_MK.TB_MK_CL_USER_MON DROP PARTITION CL_USER_MON_200701;</p>
<p>#表空间与数据文件<br />
select tablespace_name,file_name from dba_data_files where tablespace_name in(<br />
'TBS_DW_CUST_DATA_0'<br />
,'TBS_DW_CUST_DATA_1'<br />
,'TBS_DW_CUST_DATA_2'<br />
,'TBS_DW_CUST_DATA_3'<br />
,'TBS_DW_CUST_DATA_4'<br />
,'TBS_DW_CUST_DATA_5'<br />
,'TBS_DW_CUST_DATA_6'<br />
,'TBS_DW_CUST_DATA_H1'<br />
,'TBS_DW_CUST_DATA_H10'<br />
,'TBS_DW_CUST_DATA_H11'<br />
,'TBS_DW_CUST_DATA_H12'<br />
,'TBS_DW_CUST_DATA_H2'<br />
,'TBS_DW_CUST_DATA_H3'<br />
,'TBS_DW_CUST_DATA_H4'<br />
,'TBS_DW_CUST_DATA_H5'<br />
,'TBS_DW_CUST_DATA_H6'<br />
,'TBS_DW_CUST_DATA_H7'<br />
,'TBS_DW_CUST_DATA_H8'<br />
,'TBS_DW_CUST_DATA_H9'<br />
)<br />
order by 1,2;</p>
<p>##################################<br />
---LOB<br />
##################################<br />
ALTER TABLE foo MOVE<br />
TABLESPACE new_tbsp STORAGE(new_storage)<br />
LOB (lobcol) STORE AS lobsegment<br />
(TABLESPACE new_tbsp STORAGE (new_storage));</p>
<p><br />
##################################<br />
---月空间占用情况<br />
##################################</p>
<p>select SYS_CONTEXT ('USERENV', 'db_name') db_name,'JUN',t2.tablespace_name,round(sum(t1.bytes)/1024/1024/1024 ) as GB<br />
&nbsp; from dba_segments t1,tb_sys_tab_partitions t2<br />
&nbsp; where 1=1<br />
&nbsp;&nbsp; and t1.segment_name= t2.table_name<br />
&nbsp;&nbsp; and t1.partition_name like '%200706%'<br />
&nbsp;&nbsp; and t2.tablespace_name not like '%0'<br />
&nbsp;&nbsp; and t1.segment_type='TABLE PARTITION'<br />
&nbsp;and t2.owner&lt;&gt;'DGDM_ODS'<br />
&nbsp; group by t2.tablespace_name<br />
&nbsp; order by 1,2,3;</p>
<p>select sys_context ('USERENV', 'db_name') db_name,t.tablespace_name,round(sum(bytes/(1024*1024*1024)),0) &quot;ts_size(G)&quot;<br />
from sys.dba_tablespaces t, sys.dba_data_files d <br />
where t.tablespace_name = d.tablespace_name <br />
and t.tablespace_name like '%3'<br />
and t.tablespace_name &lt;&gt;'TBS_ODS_DATA_3'<br />
group by t.tablespace_name<br />
order by 1,2; </p>
<p>select segment_name,sum(bytes)/1024/1024 MB <br />
from dba_segments <br />
where segment_name in <br />
&nbsp;(select TAble_name from tb_sys_tab_partitions <br />
&nbsp; where tablespace_name&nbsp;&nbsp; like 'TBS_MK_LIST_DATA' <br />
&nbsp; --and table_name like 'TB_MK%'<br />
&nbsp; )<br />
and partition_name like '%200707%'<br />
group by segment_name order by 1;</p>
<p>select segment_name,sum(bytes)/1024/1024 MB <br />
from dba_segments <br />
where segment_name in <br />
&nbsp;(select TAble_name from tb_sys_tab_partitions where 1=1 <br />
&nbsp; -- and tablespace_name&nbsp; like 'TBS_MK_LIST_DATA' <br />
&nbsp;and table_name like 'TB_MK_LS%'<br />
&nbsp;)<br />
and partition_name like '%200707%'<br />
group by segment_name order by 1;</p>
<p>update dgdm_mk.tb_sys_tab_partitions set tablespace_name='TBS_MK_FACT_DATA' where table_name<br />
IN(<br />
'TB_MK_CL_FX_BILL'<br />
,'TB_MK_SC_CELL_DAY_MID'<br />
,'TB_MK_SC_USER_CELL_WEEK_TEN'<br />
,'TB_MK_SC_USER_DAY'<br />
,'TB_MK_SC_USER_DTAL'<br />
,'TB_MK_SC_USER_PLUS_DAY'<br />
);</p>
<p>TB_MK_CL_FX_BILL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16<br />
TB_MK_SC_CELL_DAY_MID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5432<br />
TB_MK_SC_USER_CELL_WEEK_TEN&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
TB_MK_SC_USER_DAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6428<br />
TB_MK_SC_USER_DTAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7224<br />
TB_MK_SC_USER_PLUS_DAY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4814</p>
<p><br />
--Using the GROUPING SETS Clause: Example<br />
SELECT channel_desc, calendar_month_desc, co.country_id,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TO_CHAR(sum(amount_sold) , '9,999,999,999') SALES$<br />
&nbsp;&nbsp; FROM sales, customers, times, channels, countries co<br />
&nbsp;&nbsp; WHERE sales.time_id=times.time_id <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND sales.cust_id=customers.cust_id <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND sales.channel_id= channels.channel_id <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND customers.country_id = co.country_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND channels.channel_desc IN ('Direct Sales', 'Internet') <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND times.calendar_month_desc IN ('2000-09', '2000-10')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND co.country_id IN ('UK', 'US')<br />
&nbsp; GROUP BY GROUPING SETS( <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (channel_desc, calendar_month_desc, co.country_id), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (channel_desc, co.country_id), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( calendar_month_desc, co.country_id) );</p>
<p>CHANNEL_DESC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALENDAR CO SALES$<br />
-------------------- -------- -- --------------<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,378,126<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,388,051<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,835,557<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,908,706<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 911,739<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 876,571<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,732,240<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,893,753<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,766,177<br />
Direct Sales&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5,744,263<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,788,310<br />
Internet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,625,993<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,289,865<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-09&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4,567,797<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; UK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,264,622<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000-10&nbsp; US&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4,802,459<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/129759#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Oct 2007 16:44:24 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/129759</link>
        <guid>http://hanxinyu.javaeye.com/blog/129759</guid>
      </item>
      <item>
        <title>常用oracle操作(二)</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/129757" style="color:red;">http://hanxinyu.javaeye.com/blog/129757</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">-----------------------------------查看存储过程的情况-----------------------------------------------------------<br />
查看存储过程内容：select text from user_source where name =upper('sp_kr_pd_markplan_info')<br />
查看是否调用存储过程：select * from dgdm_dw.tb_dw_sys_log where table_name='TB_DW_MD_WORKF_MARKPLAN_CUR';<br />
查看分区的命令：从视图user_tab_partitions&nbsp; 和&nbsp; user_segments 中可以查询到<br />
删除分区的命令: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单个删：alter table table_name drop partition partition_name <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;删除一个表下所有的分区：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT 'alter table '||owner||'.'||segment_name||' drop partition '||partition_name||';'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from dba_segments where <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; segment_name like 'TB_MK_LS_USER_CELL_DTAL_MID'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by partition_name<br />
增加新分区命令：alter table table_name add partition partition_name values()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alter table dgdm_mk.TB_MK_SC_CALL_FEE_DAY&nbsp; add partition CALL_FEE_DAY_20070930 values(to_date(20070930,'yyyymmdd') ) tablespace tbs_mk_list_data_3;<br />
查看存储过程中含有tb_kr_kpi_nuser_day：select * from user_source t where t.type like '%tb_kr_kpi_nuser_day%'<br />
查看表结构命令 select dbms_metadata.get_ddl('TABLE','TB_KR_SC_VIP_MON','dgdm_kr') from dual;</font></p>
<p><font face="Arial">查看存储过程命令 select text from user_source where name =upper('sp_kr_pd_markplan_sta_qqt')；<br />
编译存储过程 alter procedure sp_kr_pd_markplan_sta_qqt COMPILE；<br />
压缩分区或者表数据<br />
execute immediate 'alter table tb_mk_user_opp_last_call_day move partition OPP_LAST_CALL_DAY_'||iv_date||' compress'; </font></p>
<p><font face="Arial">-------------------------------------批量执行存储过程-----------------------------------------<br />
run.sql内容：<br />
var hhh number;<br />
exec dgdm_mk.SP_DWMK_OPP_USER_CELL_MON('20070815',:hhh);<br />
/<br />
exec dgdm_mk.SP_DWMK_OPP_USER_INFO('20070815',:hhh);<br />
/<br />
exec dgdm_mk.SP_DWMK_OPP_USER_INFO_WEEK('20070815',:hhh);<br />
/<br />
exit;<br />
登陆sqlplus后执行@run.sql<br />
或者在unix用户下执行sqlplus user/password @run.sql</font></p>
<p><font face="Arial">nohup sqlplus user/password @test.sql&amp;&nbsp; 放到后台执行并写入日志文件 nohup.out文件中<br />
cat nohup.out;&nbsp; 可查看日志</font></p>
<p><font face="Arial">-------------------------------------权限问题-------------------------------------------------------------------------</font></p>
<p><font face="Arial">grant all on test.hxytmp to public;</font></p>
<p><font face="Arial">------------------------------------查看进程情况----------------------------------------------------------<br />
select&nbsp;&nbsp; p.spid,c.object_name,a.sid,a.serial#,b.session_id,b.oracle_username,b.os_user_name&nbsp;&nbsp; <br />
from&nbsp;&nbsp; v$process&nbsp;&nbsp; p,v$session&nbsp;&nbsp; a,&nbsp;&nbsp; v$locked_object&nbsp;&nbsp; b,all_objects&nbsp;&nbsp; c&nbsp;&nbsp; <br />
where&nbsp;&nbsp; p.addr=a.paddr&nbsp;&nbsp; and&nbsp;&nbsp; a.process=b.process&nbsp;&nbsp; and&nbsp;&nbsp; c.object_id=b.object_id&nbsp; </font></p>
<p><font face="Arial">-----------------------------------查看表和基本信息的情况--------------------------------------------------------------<br />
显示表结构：<br />
select dbms_metadata.get_ddl('TABLE','TB_MK_SC_USER_WEEK','DGDM_MK') FROM DUAL;</font></p>
<p><font face="Arial">1、查看表空间的名称及大小 <br />
column db_name format a10<br />
select SYS_CONTEXT ('USERENV', 'db_name') db_name,t.tablespace_name,round(sum(bytes/(1024*1024)),0) ts_size <br />
from sys.dba_tablespaces t, sys.dba_data_files d <br />
where t.tablespace_name = d.tablespace_name <br />
group by t.tablespace_name<br />
order by 2; </font></p>
<p><font face="Arial">6、查看表空间的使用情况 <br />
select tablespace_name,round(sum(bytes)/1024/1024/1024) as free_space <br />
from dba_free_space <br />
group by tablespace_name<br />
order by 1; </font></p>
<p><font face="Arial">移动表分区到指定的表空间中<br />
select 'alter table dgdm_mk.'||table_name<br />
&nbsp;||' move partition '||partition_name<br />
&nbsp;||' tablespace tbs_mk_list_data_'||case mod(substr(partition_name,-4,2),6) when 0 then 6 else mod(substr(partition_name,-4,2),6) end <br />
&nbsp;||';'<br />
from all_tab_partitions where table_name = 'TB_MK_SC_CALLLIST_FEE_DAY'<br />
;</font></p>
<font face="Arial">
<p><br />
--表空间使用情况<br />
SELECT A.TABLESPACE_NAME,round(A.BYTES/1024/1024/1024) TOTAL,round(B.BYTES/1024/1024/1024) USED, round(C.BYTES/1024/1024/1024) FREE, <br />
round((B.BYTES*100)/A.BYTES,2) &quot;% USED&quot;,round((C.BYTES*100)/A.BYTES,2) &quot;% FREE&quot; <br />
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C <br />
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME<br />
--and round((B.BYTES*100)/A.BYTES,2) &gt;90<br />
order by 1; </p>
<p>--表空间内对象<br />
column segment_name format a30<br />
column partition_name format a30<br />
select segment_name,partition_name,bytes/1024/1024 from dba_segments where tablespace_name ='TBS_DW_LIST_DATA_5' order by 1,2;</p>
<p>压缩分区<br />
alter table dgdm_dw.tb_dw_ls_cdr_gsm move partition ls_cdr_gsm_20070501 compress parallel 30;<br />
--对象有效性<br />
Select owner,object_Name,status From all_objects <br />
Where owner In('GDDM_CB','DGDM_ODS','DGDM_DW','DGDM_KR','DGDM_MK') <br />
&nbsp;And object_type In ('PROCEDURE','FUNCTION')<br />
Order By 1,2</p>
<p>select dbms_metadata.get_ddl('TABLE','TB_KR_SC_VIP_MON','dgdm_kr') from dual;</p>
<p>----------------------------------------临时表空间------------------------------------------------------<br />
--v$sort_segment字典可以记载temp的比较详细的使用情况<br />
select tablespace_name,current_users,total_blocks,used_blocks,free_blocks from v$sort_segment;<br />
--v$sort_usage将会告诉我们是谁在做什么<br />
select username,session_addr,sqladdr,sqlhash from v$sort_usage;<br />
--更详细的操作<br />
select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value)) as Space,tablespace,segtype,sql_text from v$sort_usage su,v$parameter p,v$session se,v$sql s<br />
where p.name='db_block_size' and su.session_addr=se.saddr and s.hash_value=su.sqlhash and s.address=su.sqladdr order by se.username,se.sid;</p>
<p><br />
---------------------------------------oracle导入导出数据(备份)----------------------------------------</p>
<p>oracle数据库备份有两种方法：物理备份(数据库运行在归档模式下)和<br />
&nbsp;逻辑备份(数据库不需要运行在归档模式下，通常业务数据库采用逻辑备份，它备份比较简单)<br />
逻辑备份数据库：<br />
&nbsp;oracle数据库的逻辑备份有三种模式：表备份，用户备份，完全备份<br />
&nbsp;表备份：备份某个用户下指定的对象，备份到本地文件命令：<br />
&nbsp;&nbsp;exp icdmain/icd rows=y indexs=n compress=n buffer=65536 feedback=100000 volsize=0<br />
&nbsp;&nbsp;file=test.dmp log=test.log tables=icdmain.table1,icdmain.table2 STATISTICS=none<br />
&nbsp;用户备份：备份某个用户模式下所有的对象，备份到本地文件命令：<br />
&nbsp;&nbsp;exp icdmain/icd owner=icdmain rows=y indexs=n compress=n buffer=65536 feedback=100000 volsize=0<br />
&nbsp;&nbsp;file=test.dmp log=test.log STATISTICS=none<br />
&nbsp;完全备份：备份完整的数据库，备份到本地的命令如下：<br />
&nbsp;&nbsp;exp icdmain/icd <br />
恢复方案：<br />
&nbsp;数据库逻辑恢复分为表恢复、用户恢复、完全恢复三种模式<br />
&nbsp;表恢复：<br />
&nbsp;&nbsp;A:恢复备份数据的全部内容,转向文件所在的目录,从本地文件恢复<br />
&nbsp;&nbsp;&nbsp;imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexs=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0<br />
&nbsp;&nbsp;&nbsp;file=test.dmp log=test.log STATISTICS=none<br />
&nbsp;&nbsp;B:恢复备份数据<br />
&nbsp;&nbsp;&nbsp;imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexs=n commit=y buffer=65536 feedback=100000 ignore=n volsize=0<br />
&nbsp;&nbsp;&nbsp;file=test.dmp log=test.log tables=table1,table2<br />
&nbsp;用户恢复：<br />
&nbsp;&nbsp;imp icdmain/icd fromuser=icdmain touser=icdmain rows=y indexes=n <br />
&nbsp;&nbsp;commit=y buffer=65536 feedback=100000 ignore=n volsize=0 <br />
&nbsp;&nbsp;file=exp_icdmain_yyyymmdd.dmp log=imp_icdmain_yyyymmdd.log<br />
&nbsp;完全模式：<br />
&nbsp;&nbsp;imp system/manager rows=y indexes=n commit=y buffer=65536 <br />
&nbsp;&nbsp;feedback=100000 ignore=y volsize=0 full=y <br />
&nbsp;&nbsp;file=exp_icdmain_yyyymmdd.dmp log=imp_icdmain_yyyymmdd.log&nbsp;&nbsp;<br />
参数说明 <br />
1. ignore参数 <br />
Oracle在恢复数据的过程中，当恢复某个表时，该表已经存在，就要根据ignore参数的设置来决定如何操作。 <br />
若ignore=y，Oracle不执行CREATE TABLE语句，直接将数据插入到表中，如果插入的记录违背了约束条件，比如主键约束，则出错的记录不会插入，但合法的记录会添加到表中。 <br />
若ignore=n，Oracle不执行CREATE TABLE语句，同时也不会将数据插入到表中，而是忽略该表的错误，继续恢复下一个表。 <br />
2. indexes参数 <br />
在恢复数据的过程中，若indexes=n，则表上的索引不会被恢复，但是主键对应的唯一索引将无条件恢复，这是为了保证数据的完整性。&nbsp;&nbsp;<br />
恢复方法 <br />
业务数据库采用表恢复方案。在用IMP进行恢复前，先在SYS用户下运行CATEXP.SQL文件（如果以前已运行该文件，则不要执行这个脚本），然后执行下列命令： <br />
IMP ICDMAIN/ICD FILE=文件名 LOG=LOG文件名 ROWS=Y <br />
COMMIT=Y BUFFER=Y IGNORE=Y TABLES=表名 <br />
注：要恢复的表名参照备份的表名 <br />
　 。恢复是在原表基础上累加数据 <br />
　 。没有特殊说明，不允许在客户端执行恢复命令<br />
恢复时注意事项：如果存在分区表，目标分区表中的分区必须存在源分区表中的分区，否则会提示分区不存在&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
从oracle数据库导出数据命令：<br />
exp dgdm_ods/dgdm_ods file=XXXX0615 log=XXXX0615 direct=y tables=dgdm_dw.ab1,tab2,tab3:part1,tab4:part2,<br />
&nbsp;<br />
表的话直接写表名,可以加上用户名<br />
direct=y：从直接路径倒出数据，比常规方式更快速;</p>
<p>导入数据命令：<br />
imp dgdm_kr/dgdm_kr file=kr0615.dmp full=y&nbsp; log=imp.kr0615.dmp.log ignore=y</p>
<p>导出表结构和存储过程<br />
exp dgdm_ods/dgdm_ods file=dgdm_ods_struct rows=no log=dgdm_ods<br />
...<br />
关键是rows=no不导入数据</p>
<p>---------------------------------------oracle数据库启动和关闭----------------------------------------<br />
ORA-01033: ORACLE initialization or shutdown in progress <br />
原因：可能是起了一个sqlplus来关闭数据库，但数据库还没有完全关闭之前，从操作系统里把刚才那个sqlplus的进程给杀掉了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另一种可能是oracle的一些核心后台进程，被人从操作系统里杀掉了，那么在关闭数据库是就出现了问题<br />
解决方法：<br />
1.在dos下执行sqlplus /nolog<br />
2.以sysdba连接conn / as sysdba<br />
3.startup<br />
4.shutdown immediate<br />
5.startup<br />
数据库成功装载成功</p>
<p>conn bim as sysdba<br />
----------------------------------常用UNIX命令-------------------------------------------------<br />
compress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 压缩文件<br />
df&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看文件包下的空间使用情况<br />
rm -f *.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除所有文件<br />
rm -r hxy&nbsp;&nbsp;&nbsp;&nbsp; 删除文件夹hxy<br />
mdel or del&nbsp;&nbsp; ftp时删除文件命令<br />
get filename&nbsp; 取得文件<br />
mget *.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得多个文件<br />
put filename&nbsp; 放入文件<br />
mput *.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 放入多个文件</p>
<p>!ls,!pwd&nbsp;&nbsp; ftp或者telnet时!用来切换目录</p>
<p>SCO命令--df <br />
出自：http://www.fanqiang.com 2001年10月07日 11:29 <br />
df命令（disk free的缩写），其功能是显示磁盘可用空间数目信息及空间i结 <br />
　　　　点信息。换句话说，就是报告在任何安装的设备或目录中，还剩多少自由的空 <br />
　　　　 间。 <br />
　　　　 命令格式：df [-f]　[-i]　[-t]　[-v]　[filesystem list] <br />
　　　　 df命令选项说明： <br />
　　　　　 -f 报告文件系统空闲磁盘空间中的自由块数　 <br />
　　　　　 -i 分别报告i结点使用数量、自由块数、总数以及所使用的i结点占总数的 <br />
　　　　　　 百分比　 <br />
　　　　　 -t 报告文件系统占用的全部块数、i结点以及未使用数量 <br />
　　　　　 -v 分别报告文件系统拥有的总块数、已使用块数、自由块数以自由块数所占 <br />
　　　　　　　的百分比 </p>
<p>&nbsp;</p>
<p>declare <br />
&nbsp;vd date;<br />
&nbsp;vd_date date;<br />
&nbsp;x number;<br />
&nbsp;vmsg varchar(128);<br />
begin<br />
&nbsp;vd :=to_date(20070801,'yyyymmdd');<br />
&nbsp;vd_date := to_date(20070929,'yyyymmdd');<br />
&nbsp;while vd&lt; vd_date loop<br />
&nbsp; dgdm_mk.SP_MK_SC_CALL_FEE_DISC_DTAL(to_char(vd,'yyyymmdd'),x);<br />
&nbsp; vmsg := 'SP_MK_SC_CALL_FEE_DISC_DTAL:'||to_char(vd,'yyyymmdd');<br />
&nbsp; insert into test.hxytmp values(vmsg);<br />
&nbsp; commit;<br />
&nbsp; vd := vd+1;<br />
&nbsp;end loop;<br />
end;<br />
/</p>
<p>select partition_name,bytes/1024/1024 from user_segments where segment_name = 'TB_MK_USER_LAST_CALLLIST_DAY' order by partition_name<br />
</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/129757#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Oct 2007 16:43:10 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/129757</link>
        <guid>http://hanxinyu.javaeye.com/blog/129757</guid>
      </item>
      <item>
        <title>Java数据库连接池技术</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/123358" style="color:red;">http://hanxinyu.javaeye.com/blog/123358</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="tit">Java数据库连接池技术</div>
<div class="date"></div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>在执行数据库SQL语句时，我们先要进行数据连接；而每次创建新的数据库的连接要消耗大量的资源，这样，大家就想出了数据库连接池技术。它的原理是，在运行过程中，同时打开着一定数量的数据库连接，形成数据连接池，当需要用到数据连接时，就从中取出一个连接，完成某些SQL操作后，系统自动回收，以供其它用户（或进程）调用。</p>
            <p>&nbsp;</p>
            <p>我们知道，java标准的java.sql.Connection表示一个数据连接。我们封装了这个类，形成自己的数据库连接池。为了说明方便，这里用实际的类来显示：</p>
            <p>DBConnectionPool 真正的数据连接池</p>
            <p>DBConnectionManager 对多个池进行管理</p>
            <p>&nbsp;</p>
            <p>之间的关系如下：</p>
            <p>实际执行过程：</p>
            <p>1) 新建一个DBConnectionManager类的实例。</p>
            <p>2) 然后调用DBConnectionManager. CreatePool()创建一个连接池，并把这个连接池加入到pools的HasthTable中。(这种过程可执行多次，对应不同的数据连接，可能是sql2k的，也可能是oracle的，但生成的DBConnectionPool都要放到pools中进行统一管理，用并用一个名字与相应的DBConnectionPool对应起来)。</p>
            <p>3) 当需要数据连接时，首先得到一个DBConnectionPool，然后从DBConnectionPool中看有没有空闲的连接，如果有，则使用。如果没有，显没过最大连接数，则创建一个Connection连接，并返回这上连接。</p>
            <p>4) 如果某个连接使用完毕，则调用DBConnectionManager.freeConnection(String name, Connection con)，它又调用DBConnectionPool. freeConnection(Connection con)，此时，连接并不真正释放，而是把这个暂时不用的Connection放到DBConnectionPool的freeConnections数组中，同时，通知其它正在等待连接的线程。这样，以后要用时，就不用再新建Connection。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/123358#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 17:35:16 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/123358</link>
        <guid>http://hanxinyu.javaeye.com/blog/123358</guid>
      </item>
      <item>
        <title>mysql双机热备份</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/95530" style="color:red;">http://hanxinyu.javaeye.com/blog/95530</a>&nbsp;
          发表时间: 2007年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步，主从模式，互相备份模式的功能，该功能可将一个数据库的工作量分摊于多个Mysql服务器之上，但考虑到种种因素，不要使用过多的同步服务器。最好的方案是根据网站的性质和结构，设置&ldquo;一写多读&rdquo;或&ldquo;一读多写&quot;的服务器模式。</p>
<p>　　数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件（一般是my.cnf）在/etc/mysql/my.cnf 或者在mysql用户的home目录下面的my.cnf。</p>
<p>设置方法：<br />
设置范例环境：<br />
　　mysql：4.0.4-beta-max-nt-log<br />
　　A ip:10.10.10.22<br />
　　B ip:10.10.10.53<br />
A:设置<br />
　　1.增加一个用户最为同步的用户帐号：<br />
GRANT FILE ON *.* TO <a href="mailto:backup@'10.10.10.53'">backup@'10.10.10.53'</a> IDENTIFIED BY &lsquo;1234'<br />
　　2.增加一个数据库作为同步数据库：<br />
create database backup<br />
B:设置<br />
　　1.增加一个用户最为同步的用户帐号：<br />
GRANT FILE ON *.* TO <a href="mailto:backup@'10.10.10.22'">backup@'10.10.10.22'</a> IDENTIFIED BY &lsquo;1234'<br />
　　2.增加一个数据库作为同步数据库：<br />
create database backup</p>
<p>　　主从模式：A-&gt;B<br />
　　A为master<br />
　　修改A mysql的my.ini文件。在mysqld配置项中加入下面配置：<br />
server-id=1<br />
log-bin<br />
#设置需要记录log 可以设置log-bin=c:mysqlbakmysqllog 设置日志文件的目录，<br />
#其中mysqllog是日志文件的名称，mysql将建立不同扩展名，文件名为mysqllog的几个日志文件。<br />
binlog-do-db=backup #指定需要日志的数据库</p>
<p>　　重起数据库服务。<br />
　　用show master status 命令看日志情况。</p>
<p>　　B为slave<br />
　　修改B mysql的my.ini文件。在mysqld配置项中加入下面配置：<br />
server-id=2<br />
master-host=10.10.10.22<br />
master-user=backup #同步用户帐号<br />
master-password=1234<br />
master-port=3306<br />
master-connect-retry=60 预设重试间隔60秒<br />
replicate-do-db=backup 告诉slave只做backup数据库的更新</p>
<p>　　重起数据库<br />
　　用show slave status看同步配置情况。</p>
<p>　　注意：由于设置了slave的配置信息，mysql在数据库目录下生成master.info<br />
　　所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。</p>
<p>　　双机互备模式。</p>
<p>　　如果在A加入slave设置，在B加入master设置，则可以做B-&gt;A的同步。<br />
　　在A的配置文件中 mysqld 配置项加入以下设置：<br />
master-host=10.10.10.53<br />
master-user=backup<br />
master-password=1234<br />
replicate-do-db=backup<br />
master-connect-retry=10</p>
<p>　　在B的配置文件中 mysqld 配置项加入以下设置：<br />
log-bin=//var/log/mysqllogmysqllog<br />
binlog-do-db=backup</p>
<p>　　注意：当有错误产生时*.err日志文件。同步的线程退出，当纠正错误后要让同步机制进行工作，运行slave start</p>
<p>　　重起AB机器，即可实现双向的热备。</p>
          <br/>
          <span style="color:red;">
            <a href="http://hanxinyu.javaeye.com/blog/95530#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Jun 2007 14:34:41 +0800</pubDate>
        <link>http://hanxinyu.javaeye.com/blog/95530</link>
        <guid>http://hanxinyu.javaeye.com/blog/95530</guid>
      </item>
      <item>
        <title>64位服务器采购全攻略</title>
        <author>hanxinyu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hanxinyu.javaeye.com">hanxinyu</a>&nbsp;
          链接：<a href="http://hanxinyu.javaeye.com/blog/95529" style="color:red;">http://hanxinyu.javaeye.com/blog/95529</a>&nbsp;
          发表时间: 2007年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          当今的服务器市场，以X86指令集为基础的IA架构（PC）服务器已成为绝对的主流，而近期及未来服务器技术的发展，绝大部分都已经或将要应用于PC服务器领域。
<p><font size="2">&nbsp;&nbsp;&nbsp; 从国内市场来看，各大服务器厂商都在不断加快推出新产品的速度，在持续提高PC服务器性能的同时，使最新的信息技术越来越广泛地服务于社会生活的各个领域。国民经济的飞速发展也反映在对服务器产品需求的日益增长和应用水平的日益提高。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; 互联网技术的发展进一步推动了人们对网络节点――服务器的需求，随着主干网带宽以每6个月增加一倍的速度发展，每个人拥有的数据量也在以每年一倍的速度增加。今天的PC服务器面对各种各样的用户需求，除了文件、电子邮件及打印服务等传统任务外，还承担起了数据库查询，语音、视频应用等多媒体新任务。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; 面对以数据库、ERP、CRM、SCM&hellip;为核心的实时企业管理应用，面对以浏览、e-mail、数据库服务、在线交易、流媒体服务等