内存缓冲和无效队列

存储缓冲区和无效队列还是为了更好的利用CPU的高执行率。

首先印出来一个概念:缓存行(cacheline),数据在缓存里面不是杂乱无章的存储的,它是以缓存行的形式存储的。缓存行的大小就是CPU一次处理的最大数据的大小。CPU读取和修改数据都是直接对缓存行进行操作的,高速缓存里面都是有一个个的缓存行组成的。
在此特别感谢http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这篇文章的作者,里面写的非常细。

1.MESI协议的缺点

关于MESI协议我之前的一篇文章https://blog.csdn.net/qq_30055391/article/details/84862422 介绍过。
在MESI协议里面如何一个CPU要修改一个处于shared状态的变量非常麻烦的。首先、
1.本地缓存行将会通过寄存器控制器向远程拥有相同缓存行的寄存器发送一个RFO请求(Request For Owner),告诉其他CPU里面的缓存把缓存里面的值为valid状态,然后待收到各个缓存的(valid ack)已经完成无效状态修改的回应之后,
2.再把自己的状态改为Exclusive,之后再进行修改。
3.修改后再改为Modified状态,数据写入缓存行。
上面这几步大家可以看到第一步的时候,CPU需要在等待所有的valid ack之后才会进行下面的操作。这部分就会让CPU产生一定的阻塞,无法充分利用CPU。这个时候就印出来了存储缓冲区 storeBuffer。

2.存储缓冲区

存储缓冲区的作用就是修改一个变量的时候,直接执行修改的操作不直接镇对缓存行,而是针对一个叫制作storeBuffer的位置来操作的。这样CPU在执行修改操作的时候,直接把数据写入到storeBuffer里面,并发出广播告知其他CPU,你们的缓存里面需要变为validate状态,然后去执行其他的操作,等接受到validate ack的时候才会回来把缓冲区里面的值写入到缓存行里面。
下面是一个简单的架构图。
在这里插入图片描述

3.无效队列

存储缓冲器的大小是有限的。如果存储缓冲区满了,那么依然需要等待validate ack的回复后才可以继续执行运算。但是对方的CPU可能当时正在执行其他的操作。无法及时把缓存里面的值改为validate状态,并发回validate ack操作。这个时候为了继续优化这段CPU空闲的时间。就出现了无效队列!
在这里插入图片描述
无效队列的作用就是CPU接收到validate广播的时候马上返回给对方validate ack响应。等当前的操作执行完再回来真正的把缓存里面的值标识为validate状态。

4.存储缓存跟无效队列造成的问题

存储缓存造成的问题就是在对方CPU还没有给我们回答的时候我们已经执行下一步代码了。
无效队列造成的问题就是在CPU已经给对方应答的时候自己本身还没有去把这个值validate掉。
上面的这两种情况有的时候我们是不希望它发生的。这个时候我们上一篇文章讲到的内存屏障就派上用场了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL服务器性能优化全文共3页,当前为第1页。MySQL服务器性能优化全文共3页,当前为第1页。 MySQL服务器性能优化全文共3页,当前为第1页。 MySQL服务器性能优化全文共3页,当前为第1页。 MySQL服务器性能优化 MySQL服务器性能优化全文共3页,当前为第2页。MySQL服务器性能优化全文共3页,当前为第2页。 MySQL服务器性能优化全文共3页,当前为第2页。 MySQL服务器性能优化全文共3页,当前为第2页。 导读:网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL 默认的系统参数能够让MySQL运行得非常顺畅。 网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。 通过在网络上查找资料和自己的尝试,我认为以下系统参数是比较关键的: (1)、back_log: 要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。 back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。 当你观察你的主机进程列表,发现大量 264084 " unauthenticated user " xxx.xxx.xxx.xxx " NULL " Connect " NULL " login " NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。 (2)、interactive_timeout: 服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。 (3)、key_buffer_size: 索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为402649088(400MB)。 MySQL服务器性能优化全文共3页,当前为第3页。MySQL服务器性能优化全文共3页,当前为第3页。(4)、max_connections: 允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。 MySQL服务器性能优化全文共3页,当前为第3页。 MySQL服务器性能优化全文共3页,当前为第3页。 (5)、record_buffer: 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M) (6)、sort_buffer: 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。 (7)、table_cache: 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。 (8)、thread_cache_size: 可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。 (10)、wait_timeout: 服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为72
贺辞 序 前言 第1章 建立和配置数据库 1.1 数据库创建规划 1.1.1 规划以及提出正确的问题 1.1.2 怎样确定恰当的数据块尺寸 1.2 组织文件系统 1.2.1 怎样命名数据库文件 1.2.2 使用最佳灵活结构 1.2.3 怎样配置符合 OFA 的 Oracle 文件 系统 1.3 规划数据库文件布局 1.3.1 最大化可用性的规划 1.3.2 最小化磁盘争用的规划 1.4 建立参数文件 1.4.1 配置参数的一些注意事项 1.4.2 建立参数文件的连接 1.4.3 优化数据字典存储 1.5 理解 CREATE DATABASE 命令 1.6 创建数据库的技术 1.6.1 利用 Oracle 安装程序创建数据库 1.6.2 使用安装程序创建数据库的注意 事项 1.6.3 怎样建立自己的定制数据库创建 脚本 1.6.4 如何从已有数据库克隆数据库 1.6.5 怎样利用 Database Configuration Assistant 创建数据库 1.7 完成数据库配置 1.7.1 创建表空间 1.7.2 执行数据字典配置脚本 1.7.3 建立另外的回退段 1.7.4 修改 SYSTEM 用户的缺省和临时 表空间 1.7.5 更改 SYS 和 SYSTEM 的缺省 口令 1.7.6 建立其他用户和模式对象 1.7.7 启用归档日志方式 1.7.8 进行数据库完全备份 1.7.9 配置数据库自动启动和关闭 1.7.10 在数据库投入使用之后对其进行 监控 1.7.11 怎样列出和描述初始化参数 1.7.12 怎样列出无记载参数 1.8 回顾 第2章 管理数据存储、对象和容量 2.1 配置数据存储 2.1.1 管理可用空间碎片 2.1.2 聚集可用空间的技术 2.1.3 管理区的碎片 2.1.4 查找接近 MAXEXTENTS 值的 对象 2.1.5 避免数据字典的碎片 2.1.6 本地管理区 2.1.7 进行全数据库重组 2.1.8 定义区大小和防止碎片的11个 技巧 2.1.9 避免区出超错误 2.1.10 避免空间出超错误 2.1.11 使行链接和行迁移最小化 2.1.12 怎样检测行链接/行迁移 2.1.13 利用脚本检查模式中的链接行 2.1.14 消除行链接 2.1.15 消除行迁移 2.1.16 行链接/行迁移的技巧 2.1.17 怎样定义表的大小 2.1.18 怎样确定 PCTFREE 的最佳值 2.1.19 怎样决定 PCTUSED 的最佳值 2.1.20 怎样查找每个数据块的可用数据 区域 2.2 管理程序对象 2.2.1 怎样检查无效对象 2.2.2 怎样重新编译无效对象 2.2.3 在不同表空间之间移动索引 2.2.4 怎样查找最高点 2.2.5 怎样释放未用空间 2.3 DBMS_SPACE 程序包 2.3.1 使用 DBMS_SPACE.UNUSED _SPACE 2.3.2 使用 DBMS_SPACE.FREE _BLOCK 2.4 管理锁争用 2.4.1 怎样查找产生锁的 SQL 语句 2.4.2 怎样释放锁 2.4.3 怎样删除用户会话 2.4.4 怎样从数据字典中提取视图创建 命令 2.4.5 怎样从数据字典中提取索引定义 2.5 回顾 第3章 导出和导入技术 3.1 导出/导入特性概述 3.1.1 使用导出和导入 3.1.2 导出/导入的一般使用 3.1.3 导出方式 3.1.4 导入方式 3.1.5 创建必需的数据字典视图 3.1.6 指定导出/导入参数 3.1.7 在磁带上直接导出和导入数据 3.1.8 估计导出文件的大小 3.1.9 直接导出压缩文件 3.1.10 从压缩导出文件中直接导入 3.1.11 创建一致的导出文件 3.1.12 检查导出/导入错误 3.1.13 用导出和导入管理区 3.1.14 组织和命名导出/导入文件 3.1.15 显示导出文件的内容 3.1.16 不能对恢复同时使用导出和归档 重做日志 3.1.17 增量、累积和完全的导出和导入 3.2 怎样优化导出性能 3.2.1 使用 DIRECT 路径导出 3.2.2 对传统的路径导出使用大的 BUFFER 值 3.2.3 对直接路径导出使用 RECORDL- ENGHT 参数 3.3 怎样优化导入参数 3.3.1 使用大的回退段 3.3.2 创建几个大的联机重做日志文件 3.3.3 导入过程中关闭归档方式 3.3.4 分开导出转储文件、数据表空间、 回退段和联机重做日志文件 3.3.5 最小化检查点 3.3.6 单独创建索引 3.3.7 设置大的初始化参数 SORT_AREA _SIZE 3.3.8 使用大的导入缓冲区 3.3.9 最小化数据库提交次数 3.4 Oracle8i 的新特性 3.4.1 子分区的导出和导入 3.4.2 导出/导入多个转储文件 3.4.3 为卸载表的导出过程的选择语句 指定一个查询 3.4.4 导出/导入预计算优化程序统计 数据 3.4.5 可移动表空间 3.5 回顾 第4章 设计高可用性数据库 4.1 如何发现和保护“致命的弱点” 4.2 复用数据库控制文件 4.3 在硬件级上镜像控制文件 4.4 镜像和复用的区别 4.5 为高可用性选择磁盘类型 4.6 常规的 RAID 技巧 4.7 给控制文件增长的空间 4.8 如何配置日志组 4.9 保护 SYSTEM 表空间的三种简单 方法 4.10 为什么必须保护 ORACLE_HOME 4.11 保护操作系统 4.12 如何保护回退段 4.13 分类和划分数据 4.14 划分表空间的优先次序 4.15 如何配置高可用性的 TEMP 表空间 4.16 确保在归档日志目标位置有足够的 可用空间 4.17 如何调整联机重做日志 4.18 通过优化归档速度避免 LGWR 等待 4.19 将联机重做日志和归档重做日志文件 分开 4.20 如何加速实例的恢复 4.21 回顾 第5章 使用热备用数据库 5.1 什么是失败切换 5.2 热备用数据库 5.2.1 热备用数据库的优点 5.2.2 热备用数据库的缺点 5.2.3 建立和配置热备用数据库 5.2.4 创建备用数据库作为主数据库的 一个子集 5.2.5 选择备用站点 5.2.6 选择备用节点 5.2.7 进行热备用的失败切换 5.2.8 关于备用激活要记住的三个要点 5.2.9 备用激活后的四项工作 5.2.10 将归档重做日志自动传送到备用 数据库 5.2.11 启动管理恢复 5.2.12 只读打开备用数据库 5.2.13 热备用数据库的维护 5.3 回顾 第6章 高级的失败切换方法 6.1 将 Oracle 并行服务器用于失败切换 6.2 并行服务器失败切换的优点 6.3 并行服务器失败切换的缺点 6.4 性能考虑 6.5 降低并行服务器失败切换的时间 6.6 透明的应用程序失败切换 6.7 客户机失败切换的说明 6.8 将客户机失败切换用于负载平衡 6.9 为预定的节点停机使用客户机失败 切换 6.10 用 Oracle 复制实现失败切换 6.10.1 基本复制 6.10.2 基本复制失败切换的优点 6.10.3 基本复制失败切换的缺点 6.11 将高级复制用于失败切换 6.11.1 高级复制失败切换的优点 6.11.2 高级复制失败切换的缺点 6.12 利用 Oracle Fail Safe 6.12.1 选择节点配置 6.12.2 Oracle Fail Safe 的优点 6.12.3 Oracle Fail Safe 的缺点 6.13 其他高可用性的选项 6.13.1 鞋带状预算的高可用性:传送备份 磁带 6.13.2 采用远程镜像 6.13.3 应用程序镜像 6.14 利用混合配置技术 6.14.1 利用并行服务器与远程热备用 数据库 6.14.2 利用 Oracle Fail Safe 与远程热 备用数据库(仅 Windows NT 平台有效) 6.14.3 利用热备用数据库与远程镜像 6.15 回顾 第7章 备份和恢复技术 7.1 备份选项 7.2 操作系统备份 7.2.1 冷备份 7.2.2 OFA 和备份 7.2.3 热备份 7.2.4 使备份方式的持续时间最小化 7.2.5 为什么不应备份联机重做日志 7.2.6 ARCHIVELOG 和 NOARCHIV- ELOG方式 7.2.7 为什么应使用 ARCHIVELOG 方式 7.2.8 为什么应该复用归档重做日志 7.3 服务器管理备份 7.4 逻辑备份 7.4.1 文本文件备份 7.4.2 逻辑控制文件备份 7.4.3 使用导出和导入 7.4.4 导入方式 7.4.5 增量、累积和完全的导出和导入 7.4.6 创建一致的导出文件 7.4.7 不能同时使用导出和归档重做日志 进行恢复 7.5 开发备份和恢复计划 7.5.1 常规的备份技巧 7.5.2 快速备份的技巧 7.6 恢复策略和情况 7.6.1 数据库恢复和涉及的数据库结构 组织 7.7 各种需要恢复的情形 7.8 恢复丢失的数据文件 7.8.1 SYSTEM 数据文件的丢失 7.8.2 包含活动回退段的数据文件的丢失 7.8.3 其他数据文件的丢失 7.8.4 执行表空间恢复 7.8.5 执行数据文件恢复 7.8.6 在没有数据文件备份时怎样进行 恢复 7.8.7 恢复丢失的临时表空间 7.8.8 只读表空间丢失 7.8.9 索引表空间丢失 7.9 恢复联机重做日志 7.9.1 联机重做日志组某个成员丢失 7.9.2 非活动的重做日志组丢失 7.9.3 活动重做日志组丢失 7.10 恢复丢失的控制文件 7.10.1 被复用的控制文件成员丢失 7.10.2 控制文件完全丢失 7.11 回顾 第8章 性能优化 8.1 优化系统全局区域的技术 8.1.1 怎样优化数据缓冲区高速缓存 8.1.2 度量和优化库高速缓存的性能 8.1.3 度量和优化字典高速缓存的性能 8.1.4 怎样估计应用程序的效能 8.2 固定应用程序代码 8.2.1 怎样确定应该固定的对象 8.2.2 怎样确定当前固定的程序对象 8.2.3 怎样固定应用程序代码 8.2.4 使用 DBMS_SHARED_POOL.KEEP 的技巧 8.2.5 怎样生成进行固定操作的脚本 8.2.6 使用 DBMS_SHARED_POOL .UNKEEP 的技巧 8.3 优化数据排序的技术 8.3.1 在内存中进行全部或大部分排序 8.3.2 最小化排序时的空间管理开销 8.3.3 使用多个 TEMP 表空间分布排序 8.4 优化数据存储的技术 8.4.1 使行链接和行迁移最小化 8.4.2 检测行链接/迁移 8.4.3 确定模式中的链接行 8.4.4 防止和纠正行链接/迁移 8.4.5 行链接/迁移的技巧 8.4.6 使可用空间碎片最小化 8.4.7 使区增长最小化 8.4.8 怎样确定代价最高的查询 8.5 跟踪 SQL 8.5.1 设置用户会话内的跟踪 8.5.2 使用 DBMS_SYSTEM 设置用户 会话外的跟踪 8.5.3 生成系统跟踪 8.5.4 使用 tkprof 解释跟踪文件 8.5.5 使用 AUTOTRACE 获得 SQL 语句 执行计划和统计数据 8.6 优化回退段 8.6.1 最小化回退段争用 8.6.2 使动态扩充最小化 8.6.3 分布回退段的 I/O 8.7 优化索引 8.7.1 怎样确定和重建产生碎片的索引 8.7.2 怎样确定表的索引 8.8 优化磁盘 I/O 8.8.1 怎样查找和避免 I/O 热点 8.8.2 使用原始文件系统 8.9 生成优化程序统计数据 8.9.1 使用 DBMS_UTILITY.ANALYZE _SCHEMA收集统计数据 8.9.2 使用 DBMS_UTILITY.ANALYZE _DATABASE 收集统计数据 8.9.3 使用 DBMS_STATS 收集性能统计 数据 8.10 优化环境 8.10.1 怎样优化 Net8/SQL*Net 8.10.2 监控并优化系统资源 8.11 回顾 第9章 Oracle8i 的新特性 9.1 新的性能优化特性 9.1.1 设计的稳定性和存储概要 9.1.2 排序改进 9.1.3 实体化视图 9.1.4 利用 DBMS_STATS 收集性能统计 数据 9.2 新索引类型 9.2.1 基于函数的索引 9.2.2 反向键索引 9.2.3 降序索引 9.2.4 索引编排表 9.2.5 管理索引的新特性 9.3 新备份和恢复特性 9.3.1 多目标归档 9.3.2 多归档日志进程 9.3.3 使用 LogMiner 9.3.4 快速启动恢复 9.4 新导出/导入特性 9.4.1 使用多个导出/导入转储文件 9.4.2 选择性的查询导出 9.4.3 预先计算优化程序统计数据的导出 /导入 9.4.4 可移动表空间 9.4.5 混合导出/导入特性 9.5 新备用数据库特性 9.5.1 归档重做日志的自动传送 9.5.2 启用管理恢复 9.5.3 以只读方式打开备用数据库 9.6 管理作业队列的新特性 9.7 管理存储和对象的新功能 9.7.1 重新定位和组织表 9.7.2 删除表中的列 9.7.3 将表列标记为不可用 9.7.4 本地管理的表空间 9.8 回顾 第10章 Internet DBA 10.1 Oracle8i — Internet 数据库 10.2 Oracle 与 Java 10.3 Oracle8i Java 虚拟机 10.4 Java VM 与 Oracle8i 服务器怎样通讯 10.5 Java 与 Oracle 应用程序服务器 10.6 Oracle Jdeveloper 10.7 与 Java 有关的初始化参数 10.8 Oracle Internet 文件系统 10.9 Oracle 应用服务器概览 10.10 OAS 组件 10.11 调整 OAS 内存请求 10.12 检查建议的最小硬件 10.13 设计 Oracle 应用服务器配置 10.14 Oracle 应用服务器的安装 10.15 使用 OAS 管理程序 10.16 怎样启动和停止 OAS 组件 10.17 OAS 怎样利用负载平衡 10.18 监控 CPU 的消耗情况 10.19 监控内存消耗 10.20 回顾 第11章 使用 Oracle 提供的程序包 11.1.1 程序包:它们是什么? 11.1 DBMS_JOB 和 DBMS_IJOB 程序包 11.1.1 Oracle 作业队列的概念 11.1.2 配置 SNP 进程的技巧 11.1.3 利用 DBMS_JOB 和 DBMS_IJOB 11.1.4 调度作业 11.1.5 更改作业 11.1.6 停止作业 11.1.7 其他作业队列过程 11.1.8 监控作业队列 11.1.9 管理属于其他用户的作业 11.1.10 利用作业队列定期分析模式 对象 11.2 DBMS_SYSTEM 程序包 11.2.1 使用 DBMS_SYSTEM.SET_SQL _TRACE_IN_SESSION 11.2.2 使用 DBMS_SYSTEM.SET_EV 11.2.3 使用 DBMS_SYSTEM.READ_EV 11.2.4 确定当前会话中设置的事件级别 11.2.5 其他 DBMS_SYSTEM 程序 11.3 DBMS_SPACE 程序包 11.3.1 使用 DBMS_SPACE.UNUSED _SPACE 11.3.2 使用 DBMS_SPACE.FREE _BLOCKS 11.4 DBMS_SHARED_POOL 程序包 11.4.1 使用 DBMS_SHARED_POOL.SIZES 过程 11.4.2 使用 DBMS_SHARED_POOL.SIZES 的技巧 11.4.3 使用 DBMS_SHARED_POOL.KEEP 过程 11.4.4 使用 DBMS_SHARED_POOL.KEEP 的技巧 11.4.5 使用 DBMS_SHARED_POOL.UNKEEP 过程 11.4.6 使用 DBMS_SHARED_POOL.UNKEEP 的技巧 11.4.7 使用 DBMS_SHARED_POOL .ABORTED_REQUEST_THRESHOLD 过程 11.4.8 使用 DBMS_SHARED_POOL .ABORTED_REQUEST_THRESHOLD 的技巧 11.5 DBMS_UTILITY 11.5.1 使用 DBMS_UTILITY.COMPILE _SCHEMA过程 11.5.2 使用 DBMS_UTILITY.COMPILE _SCHEMA 的技巧 11.5.3 使用 DBMS_UTILITY.ANALYZE _SCHEMA 11.5.4 使用 DBMS_UTILITY.ANALYZE _DATABASE 11.5.5 使用 DBMS_UTILITY.GET _PARAMETER_VALUE 11.5.6 使用 DBMS_UTILITY.PORT _STRING 11.5.7 使用 DBMS_UTILITY.DB _VERSION 11.5.8 使用 DBMS_UTILITY.MAKE_DATA _BLOCK_ADDRESS 11.5.9 使用 DBMS_UTILITY.DATA_BLOCK _ADDRESS_FILE 11.5.10 使用 DBMS_UTILITY.DATA_BLOCK _ADDRESS_BLOCK 11.5.11 使用 DBMS_UTILITY.IS_PARALLEL _SERVER 11.5.12 使用 DBMS_UTILITY.CURRENT _INSTANCE 11.5.13 使用 DBMS_UTILITY.ACTIVE _INSTANCES 11.6 DBMS_ROWID 11.6.1 使用 DBMS_ROWID.ROWID _BLOCK_NUMBER 11.6.2 使用 DBMS_ROWID.ROWID _CREATE 11.6.3 使用 DBMS_ROWID.ROWID _OBJECT 11.6.4 使用 DBMS_ROWID.ROWID _RELATIVE_FNO 11.6.5 使用 DBMS_ROWID.ROWID_ROW _NUMBER 11.6.6 使用 DBMS_ROWID.ROWID_TO _ABSOLUTE_FNO 11.6.7 使用 DBMS_ROWID.ROWID _TO_EXTENDED 11.6.8 使用 DBMS_ROWID.ROWID_TO _RESTRICTED 11.6.9 使用 DBMS_ROWID.ROWID _TYPE 11.6.10 使用 DBMS_ROWID.ROWID _VERIFY 11.6.11 使用 DBMS_ROWID.ROWID _INFO 11.7 回顾 第12章 Oracle 安装和升级 12.1 Oracle 软件 12.2 Oracle 数据库 12.3 配置 Oracle 文件系统 12.3.1 最佳灵活结构 12.3.2 怎样配置一个符合 OFA 的 Oracle 文件系统 12.3.3 怎样命名数据库文件 12.3.4 为什么应对参数文件使用链接 12.4 安装 Oracle 服务器软件 12.5 安装前阶段 12.5.1 规则1:确保软件产品版本的兼 容性 12.5.2 规则2:为 Oracle 配置操作系统 12.5.3 规则3:分配足够的磁盘空间 12.5.4 规则4:配置安装环境 12.6 安装阶段 12.6.1 步骤1:配置安装环境 12.6.2 步骤2:启动 Oracle 安装 12.6.3 步骤3:选择和安装软件产品 12.7 安装后阶段:坚持五点 12.7.1 步骤1:检查错误 12.7.2 步骤2:运行 root.sh 脚本 12.7.3 步骤3:验证文件的许可权 12.7.4 步骤4:测试 Oracle 安装 12.7.5 步骤5:配置环境 12.7.6 其他安装后的任务 12.8 快速进行 Oracle 安装的五个技巧 12.8.1 从硬盘的准备区域进行安装 12.8.2 不安装文档 12.8.3 不安装产品的文档 12.8.4 不选择重新连接可执行文件 12.8.5 设置环境变量 DEF_INSTALL = TRUE 和 NO_README = TRUE 12.9 在 Windows NT 上安装 Oracle 12.9.1 安装前阶段 12.9.2 安装阶段 12.9.3 安装后阶段 12.10 修补、升级和移植 Oracle 12.10.1 始终将 Oracle 软件安装到新 的 ORACLE_HOME 目录中 12.10.2 数据库升级前进行数据库冷备份 12.10.3 移植 Oracle 12.10.4 使用 Migration Utility 移植到 Oracle 8.0.x 12.10.5 用导出和导入移植 12.11 安装 UNIX 上的 Oracle 8 12.11.1 安装前阶段 12.11.2 安装阶段 12.11.3 安装后阶段 12.12 回顾 附录 A Oracle 服务器介绍 附录 B 动态性能(V$)视图
[client] port = 3306 socket=/home/mysql/data/mysql.sock [mysqld] lower_case_table_names=1 user = mysql #--- 表示MySQL的管理用户 port = 3306 #--- 端口 #basedir=/usr/local/mysql socket=/home/mysql/data/mysql.sock #-- 启动的sock文件 datadir=/home/mysql/data log-bin=/home/mysql/mysql-bin log-error=/home/mysql/log/mysqld.log pid-file =/home/mysql/mysqld.pid bind-address = 0.0.0.0 server-id = 1 #表示是本机的序号为1,一般来讲就是master的意思 skip-grant-tables skip-name-resolve # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项, # 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 #skip-networking back_log = 600 # MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用, # 然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。 # 如果期望在一个短时间内有很多连接,你需要增加它。也就是说,如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中, # 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。 # 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。 # 你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。 max_connections = 500 # MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。 max_connect_errors = 6000 # 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。 open_files_limit = 65535 # MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections*5和ulimit -n的值,哪个大用哪个, # 当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个. table_open_cache = 128 # MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64 # 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目); # 当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上 max_allowed_packet = 1000000000 # 接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。 # 该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。 binlog_cache_size = 1M # 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K max_heap_table_size = 67108864 # 定义了用户可以创建的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。这个变量支持动态改变 tmp_table_size = 67108864 # MySQL的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。 # 大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。 # 如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果 read_buffer_size = 4194304 # MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。 # 如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能 read_rnd_buffer_size = 4194304 # MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时, # MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大 sort_buffer_size = 4194304 # MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。 # 如果不能,可以尝试增加sort_buffer_size变量的大小 join_buffer_size = 8388608 # 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享 thread_cache_size = 8 # 这个值(默认8)表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中, # 如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程, # 增加这个值可以改善系统性能.通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。(–>表示要调整的值) # 根据物理内存设置规则如下: # 1G —> 8 # 2G —> 16 # 3G —> 32 # 大于3G —> 64 #query_cache_size = 8M #MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。 # 通过检查状态值'Qcache_%',可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况, # 如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低, # 这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲 #query_cache_limit = 2M #指定单个查询能够使用的缓冲区大小,默认1M key_buffer_size = 1048576 #指定用于索引的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大, # 系统将开始换页并且真的变慢了。对于内存在4GB左右的服务器该参数可设置为384M或512M。通过检查状态值Key_read_requests和Key_reads, # 可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低, # 至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE 'key_read%'获得)。注意:该参数值设置的过大反而会是服务器整体效率降低 ft_min_word_len = 4 # 分词词汇最小长度,默认4 transaction_isolation = REPEATABLE-READ # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. # 如没有指定,MySQL默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 #超过30天的binlog删除 slow_query_log = 1 long_query_time = 1 #慢查询时间 超过1秒则为慢查询 slow_query_log_file = /home/mysql/data/mysql-slow.log performance_schema = 0 explicit_defaults_for_timestamp #lower_case_table_names = 1 #不区分大小写 skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启 default-storage-engine = InnoDB #默认存储引擎 innodb_file_per_table = 1 # InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间 # 独立表空间优点: # 1.每个表都有自已独立的表空间。 # 2.每个表的数据和索引都会存在自已的表空间中。 # 3.可以实现单表在不同的数据库中移动。 # 4.空间可以回收(除drop table操作处,表空不能自已回收) # 缺点: # 单表增加过大,如超过100G # 结论: # 共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整:innodb_open_files innodb_open_files = 500 # 限制Innodb能打开的表的数据,如果库里的表特别多的情况,请增加这个。这个值默认是300 innodb_buffer_pool_size = 1048576 # InnoDB使用一个缓冲池来保存索引和原始数据, 不像MyISAM. # 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少. # 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80% # 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸. # 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制, # 所以不要设置的太高. innodb_write_io_threads = 4 innodb_read_io_threads = 4 # innodb使用后台线程处理数据页上的读写 I/O(输入输出)请求,根据你的 CPU 核数来更改,默认是4 # 注:这两个参数不支持动态改变,需要把该参数加入到my.cnf里,修改完后重启MySQL服务,允许值的范围从 1-64 innodb_thread_concurrency = 0 # 默认设置为 0,表示不限制并发数,这里推荐设置为0,更好去发挥CPU多核处理能力,提高并发量 innodb_purge_threads = 1 # InnoDB中的清除操作是一类定期回收无用数据的操作。在之前的几个版本中,清除操作是主线程的一部分,这意味着运行时它可能会堵塞其它的数据库操作。 # 从MySQL5.5.X版本开始,该操作运行于独立的线程中,并支持更多的并发数。用户可通过设置innodb_purge_threads配置参数来选择清除操作是否使用单 # 独线程,默认情况下参数设置为0(不使用单独线程),设置为 1 时表示使用单独的清除线程。建议为1 innodb_flush_log_at_trx_commit = 2 # 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。 # 主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件(REDO LOG)中。不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1 # 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。 # 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。 # 每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘 # 默认值1是为了保证完整的ACID。当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。 # 设为0的话,mysqld进程崩溃的时候,就会丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。 # 总结 # 设为1当然是最安全的,但性能页是最差的(相对其他两个参数而言,但不是不能接受)。如果对数据一致性和完整性要求不高,完全可以设为2,如果只最求性能,例如高并发写的日志服务器,设为0来获得更高性能 innodb-buffer-pool-size = 128M innodb_log_buffer_size = 4194304 # 此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,但意外的故障将会丢失数据。MySQL开发人员建议设置为1-8M之间 innodb_log_file_size = 268435456 # 此参数确定数据日志文件的大小,更大的设置可以提高性能,但也会增加恢复故障数据库所需的时间 innodb_log_files_in_group = 3 # 为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3 innodb_max_dirty_pages_pct = 90 # innodb主线程刷新缓存池中的数据,使脏数据比例小于90% innodb_lock_wait_timeout = 120 # InnoDB事务在被回滚之前可以等待一个锁定的超时秒数。InnoDB在它自己的锁定表中自动检测事务死锁并且回滚事务。InnoDB用LOCK TABLES语句注意到锁定设置。默认值是50秒 bulk_insert_buffer_size = 1024M # 批量插入缓存大小, 这个参数是针对MyISAM存储引擎来说的。适用于在一次性插入100-1000+条记录时, 提高效率。默认值是8M。可以针对数据量的大小,翻倍增加。 myisam_sort_buffer_size = 1024M # MyISAM设置恢复表之时使用的缓冲区的尺寸,当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序 MyISAM索引分配的缓冲区 myisam_max_sort_file_size = 10G # 如果临时文件会变得超过索引,不要使用快速排序索引方法来创建一个索引。注释:这个参数以字节的形式给出 myisam_repair_threads = 1 # 如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内) interactive_timeout = 28800 # 服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。默认值:28800秒(8小时) wait_timeout = 28800 # 服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值, # 取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。参数默认值:28800秒(8小时) # MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后, # 应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开, # 最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。 # 在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大, # 可以进行适当的调整小些。要同时设置interactive_timeout和wait_timeout才会生效。 [mysqldump] quick max_allowed_packet = 16M #服务器发送和接受的最大包长度 [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M
(一)客户端组件和服务器端组件 2 (二)Oracle Database 的体系架构 2 1. 什么是数据库?什么是实例? 3 2. 存储结构 3 数据文件(data file) 4 联机日志文件(online redo log file) 4 控制文件(control file) 5 归档模式:冷备份,离线备份,热备份,联机备份 6 Spfile:二进制,9i 之后 Pfile:文本,9i 之前 6 可以将 spfile 转换为 pfile 6 注意:scope 的取值有三个:memory、spfile、both 7 一个表空间(tablespace)由一组段组成 8 Tablespaces(表空间) 8 system sysaux temp undo 8 Segments (段) 8 extents (区) 8 Data Block (数据块) 8 3. 进程结构 9 日志写进程(LGWR) 检查点进程(CKPT) 9 归档进程(ARCn) 恢复器进程(RECO) 9 2日志写进程(LGWR) 10 3检查点进程(CKPT) 10 6归档进程(ARCn) 10 7恢复器进程(RECO) 11 4. 内存结构 11 1共享池:shared pool 12 3重做日志缓冲区:log buffer 12 (三)自动内存管理和自动共享内存管理 13 (四)管理方案对象 13 (五)数据字典 15 (一)安装 Oracle Linux 7.3 64 位操作系统 17 (二)安装 Oracle Database 12cR2 19 (三)使用 DBCA 创建 Oracle 数据库 21 (四)验证 Oracle Database 12cR2 环境 25 (五)使用 oracle-database-server-12cR2-preinstall 包 25 三、管理数据库实例 27 (一)管理工具 27 (二)初始化参数 27 (三)数据库启动的过程 29 (四)数据库的关闭 29 四、配置 Oracle 的网络环境 31 (一)连接建立的过程 31 (二)使用 lsnrctl 命令 31 (三)如何配置监听器 33 (四)注册数据库的服务 34 (五)建立连接的方法 36 (六)共享服务器模式 38 (七)分布式数据库基础 40 五、管理用户和权限 42 (一)用户 42 (二)权限 46 (三)角色 51 (四)概要文件:Profile 54 六、管理数据库存储结构 57 (一)存储结构 57 (二)数据块的结构 57 (三)表空间和数据文件 57 (四)什么是自动存储管理 58 七、数据的并发处理 60 (一)锁定的机制 60 (三)锁的队列 60 (四)死锁 62 (五)手动加锁 64 (方式一)lock 语句 64 八、管理还原数据 65 (一)什么是还原数据? 65 (二)还原数据的作用 66 (三)还原数据的工作原理 66 (四)还原数据与重做数据 67 (五)管理还原数据 67 (六)还原保留期和确保还原保留期 67 九、数据库审计 68 (一)什么是数据库审计 68 (二)审计的参数设置 69 (三)强制审计 69 (四)标准审计 69 (五)基于值的审计 71 (六)细粒度审计(FGA) 71 (七)DBA 审计 73 (八)12c 审计的新特性 73 十、移动数据 76 (一)移动数据的整体架构 76 (二)目录对象 76 (三)使用 SQL*Loader 77 (四)数据泵 78 (五)外部表 80 十一、性能管理基础 82 (一)性能监视 82 (二)性能监视 82 (三)管理内存组件 83 (四)使用内存指导 83 (五)使用动态性能视图 84 (六)故障排除和优化视图 85 (七)无效和不可用对象 85 =======第二篇:备份与恢复======= 86 一、备份和恢复的基本概念 86 (一)衡量数据库可恢复性的两个指标 86 (二)数据库故障的类型 86 (三)配置数据库的可恢复性 88 (四)归档日志文件 88 (五)启用 ARCHIVELOG(归档)模式 89 (六)Oracle 数据库备份的解决方案 89 二、闪回 90 (一)什么是闪回 Flashback? 90 (五)闪回查询:Flashback Query 91 (六)闪回版本查询:Flashback Version Query 92 (七)闪回表:Flashback Table 93 (八)闪回数据库:Flashback Database 94 (九)闪回删除:Flashback Drop 95 (十)闪回事务查询:Flashback Transaction Qu
_取鼠标句柄() 获取目前选择的鼠标指针的句柄。获取目前选择的鼠标指针的句柄。这个函数返回的是当前线程的指针——不能获取其他应用程序的指针。 _寻找窗口() 寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)。找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError。 _广播系统消息() 将一条系统消息广播给系统中所有的顶级窗口。大于零表示成功;-1表示出错。如设置了BSF_QUERY,而且至少有一个消息接收者返回零,那么这个函数返回零。 _取消息鼠标位置() 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置。返回值,X坐标对应于结果值的低字,Y坐标对应于高字。 _取消息时间() 取得消息队列中上一条消息处理完毕时的时间。返回一个时间,表示为自系统启动以来经历的毫秒数。 _投递消息() 将一条消息投递到指定窗口的消息队列。投递的消息会在Windows事件处理过程中得到处理。在那个时候,会随同投递的消息调用指定窗口的窗口函数。特别适合那些不需要立即处理的窗口消息的发送。如消息投递成功,则返回TRUE(非零)。会设置GetLastError。 _投递线程消息() 将一条消息投递给应用程序。这条消息由应用程序的内部GetMessage循环获得,但不会传给一个特定的窗口。如消息投递成功,则返回TRUE(非零)。会设置GetLastError。 _注册窗口消息() 获取分配给一个字串标识符的消息编号。返回值为&C000 到 &FFFF之间的一个消息编号。零意味着出错。注:如果没有一个子类处理程序的帮助,这个函数就没有什么用。 _回应消息() 如将消息传送给位于不同进程的一个窗口,通常第一个进程会暂时挂起,直到另一个进程中的窗口函数完成操作为止。在目标进程的窗口函数完成之前,另一个进程可用这个函数向第一个进程返回一个结果,使之能继续进行。返回值,如准备答复的消息是由另一个进程发来的,则返回TRUE。如果它是从同一个进程中发出来的,则返回FALSE(此时,该函数没有任何效果)。 _发送消息() 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。返回值由具体的消息决定。 _发送回调消息() 将一条消息发给窗口。该函数最大的特定是可以立即返回。目标窗口函数执行完毕后,会用回调函数的形式将结果返回。返回值,TRUE表示成功,FALSE表示失败。会设置GetLastError。 _发送超时消息() 向窗口发送一条消息。如窗口位于不同的线程中,则利用这个函数可以指定一个超时值,以便在另一个进程挂起的时候防止调用进程也永远挂起。成功时返回TRUE,失败时返回FALSE。会设置GetLastError。 _发送通知消息() 向窗口发送一条消息。如目标窗口位于同调用方相同的线程内,则这个函数会表现为SendMessage函数。而且除非消息得到处理,否则函数不会返回。如目标窗口从属于一个不同的线程,则函数会立即返回。返回TRUE表示成功,FALSE表示出错。会设置GetLastError。 _关闭内核对象() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。返回值非零表示成功,零表示失败。会设置GetLastError。 _比较文件时间() 根据FILETIME结构的信息,对比两个文件的时间。如两个时间相等,就返回零;如lpFileTime1小于lpFileTime2,返回-1;如lpFileTime2小于lpFileTime1,返回1。 _删除文件() 返回值非零表示成功,零表示失败。会设置GetLastError。 _关闭搜索句柄() 关闭由FindFirstFile函数创建的一个搜索句柄。返回值非零表示成功,零表示失败。会设置GetLastError。 _刷新文件缓冲区() 针对指定的文件句柄,刷新内部文件缓冲区。返回值非零表示成功,零表示失败。会设置GetLastError。 _刷新文件映射缓冲区() 将写入文件映射缓冲区的所有数据都刷新到磁盘。返回值非零表示成功,零表示失败。会设置GetLastError。 注解:如与远程系统建立了文件映射,那么虽然这个函数可保证数据已在当前系统写入,但不能保证数据实际写入远程系统的磁盘——除非用FILE_FLAG_WRITE_THROUGH 选项打开文件。该选项的作用是禁止写延迟,所有更新的数据都必须立即写入磁盘。 _取可执行文件类型() 判断指定文件是哪一种类型的可执行文件。返回值非零表示成功,零表示失败。 _取压缩文件尺寸() 判断一个压缩文件在磁盘上实际占据的字节数。返回文件长度。&HFFFFFFFF表示出错。注意如lpFileSizeHigh不为NULL,且结果为&HFFFFFFFF,那么必须调用GetLastError,判断是否实际发生了一个错误,因为这是一个有效的结果。 注解:如磁盘卷已被压缩,可检查这个函数的结果是否与GetFileSize函数的结果有异,从而判断文件是否也被压缩(如有异,表明文件已被压缩)。 _取当前目录() 返回值为写到lpBuffer的字节数。如nBufferLength的长度不够,不足以容纳目录,则返回值是必要的缓冲区长度(要求至少这个长度),其中包括空中止字符。零表示失败。会设置GetLastError。 _取磁盘剩余容量() 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量。返回值非零表示成功,零表示失败。会设置GetLastError。 注解:在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB。 _取驱动器类型() 判断一个磁盘驱动器的类型。返回值,如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE, DRIVE_FIXED, DRIVE_REMOTE, DRIVE_CDROM 或 DRIVE_RAMDISK。 _取压缩文件全名() 取得一个压缩文件的全名。文件必须是用 COMPRESS.EXE 程序压缩的,而且在压缩时适用/r选项。返回值,1表示成功,LZERROR_BADVALUE 表示失败。 _取文件属性() 取指定文件的属性。返回值,-1表示出错。如返回包含了标志的一个Long值,则指定文件的属性。其中的标志对应于带有FILE_ATTRIBUTE_*前缀的常数。具体参考BY_HANDLE_FILE_INFORMATION结构的File Attribute Types table表格。 _取文件长度() 返回文件长度。&HFFFFFFFF表示出错。注意如lpFileSizeHigh不为NULL,且结果为&HFFFFFFFF,那么必须调用GetLastError,判断是否实际发生了一个错误,因为这是一个有效的结果。 _取文件类型() 在给出文件句柄的前提下,判断文件类型。返回值为下述常数之一:FILE_TYPE_UNKNOWN 文件类型未知;FILE_TYPE_DISK 属于磁盘文件;FILE_TYPE_CHAR 文件是一个控制台或打印机;FILE_TYPE_PIPE 文件是个管道 。 _取文件版本信息() 从支持版本标记的一个模块里获取文件版本信息。返回值非零表示成功,零表示失败。会设置GetLastError。 _取文件版本信息长度() 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区。返回值,容纳文件的版本资源所需的缓冲区长度。如文件不包含版本信息,则返回一个0值。会设置GetLastError。 _取文件全名() 获取指定文件的完整路径名。返回值,装载到lpBuffer中的字符数量(排除空中止字符)。如缓冲区的长度不足以容下完整的路径,则返回值就是要求的缓冲区大小。零表示失败。会设置GetLastError。 _取逻辑驱动器() 判断系统中存在哪些逻辑驱动器字母。返回值的二进制位标志着存在哪些驱动器。其中,位0设为1表示驱动器A:存在于系统中;位1设为1表示存在B:驱动器;以次类推。 _取逻辑驱动器列表() 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径。返回值,保存到lpBuffer的字符数量(排除空中止字符)。如缓冲区的长度不够,不能容下路径,则返回值就变成要求的缓冲区大小。零表示失败。会设置GetLastError。 _取INI整数() 从INI文件中指定的条目获取一个整数值。返回值,找到的键的值;如指定的条目未找到,就返回默认值。如找到的数字不是一个合法的整数,函数会返回其中合法的一部分。 注解:在Windows NT中,有些初始化文件实际是在注册表中。可在注册表的下面这个项处找到这些文件的一个列表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping _取INI小节键值表() 获取指定小节所有项名和值的一个列表。返回值,存放到lpReturnedString缓冲区的字符数量。如缓冲区的容量不够大,不能容下所有信息,就返回nSize-2。参考对GetPrivateProfileInt函数的注解。 _取INI文本() 从INI文件中指定的条目取得字串。返回值,复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符。如lpReturnedString缓冲区不够大,不能容下全部信息,就返回nSize-1(若lpApplicationName或lpKeyName为NULL,则返回nSize-2)。 注解:如lpKeyName参数为NULL,那么lpReturnedString缓冲区会载入指定小节所有设置项的一个列表。每个项都用一个NULL字符分隔,最后一个项用两个NULL字符中止。也请参考GetPrivateProfileInt函数的注解。 _取系统INI整数() 取得win.ini初始化文件中指定条目的一个整数值。返回值,找到条目的值;如指定的条目未找到,就返回默认值。如找到的数字不是一个合法的整数,函数就会返回其中合法的一部分。 _取系统IN表I小节键值() 获取指定小节(在win.ini文件中)所有项名和值的一个列表。返回值,装载到lpReturnedString缓冲区的字符数量。如缓冲区的长度不足以容下所有信息,则返回nSize-2。参考GetPrivateProfileInt函数的注解。 _取系统INI文本() 为win.ini初始化文件中指定的条目取得字串。返回值,存放到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符。如lpReturnedString缓冲区不够大,不能容下全部信息,就返回nSize-1(若lpAppName或lpKeyName为NULL,则返回nSize-2)。 _取短文件名() 获取指定文件的短路径名。返回值,装载到lpszShortPath缓冲区的字符数量。如lpszShortPath的长度不足,不能容下文件名,就返回需要的缓冲区长度。 _取Windows系统目录() 这个函数能取得Windows系统目录(System目录)的完整路径名。在这个目录中,包含了所有必要的系统文件。根据微软的标准,其他定制控件和一些共享组件也可放到这个目录。通常应避免在这个目录里创建文件。在网络环境中,往往需要管理员权限才可对这个目录进行写操作。返回值Long,存放到lpBuffer缓冲区的字符数量。如lpBuffer不够大,不能容下文件名,则返回要求的缓冲区长度。 _取临时文件名() 返回值,最终用于生成文件名的wUnique数字的值。如wUnique参数不为零,这就是参数的值。零表示失败。会设置GetLastError。 _取临时路径() 获取为临时文件指定的路径。返回值,装载到lpBuffer的字符数。如当前缓冲区的长度不够,不能容下整个路径,则返回lpBuffer需要的长度。零表示失败。会设置GetLastError。 注解:临时路径是由TMP环境变量指定的一个路径。如TMP不存在,则是由TEMP环境变量指定的路径。如果这两个环境变量都不存在,就是当前目录。 _取磁盘卷标信息() 获取与一个磁盘卷标有关的信息。返回值非零表示成功,零表示失败。会设置GetLastError。 _取Windows目录() 这个函数能获取Windows目录的完整路径名。在这个目录里,保存了大多数windows应用程序文件及初始化文件。返回值,复制到lpBuffer的一个字串的长度。如lpBuffer不够大,不能容下整个字串,就会返回lpBuffer要求的长度。零表示失败。会设置GetLastError。 _锁定文件() 在windows中,文件可用共享模式打开——在这种情况下,多个进程可同时访问该文件。利用这个函数,要对文件进行读写的一个应用程序可将文件的某一部分锁定起来,使其不能由其他应用程序访问。这样便避免了同时读写时发生的冲突。返回值,非零表示成功,零表示失败。会设置GetLastError。 注解:锁定的区域不能进行重叠操作。由不同的操作系统决定,可能要求先运行share.exe才能保证该函数正常工作。 _LZ关闭() 关闭由LZOpenFile 或 LZInit函数打开的一个文件。 _LZ复制() 复制一个文件。如源文件已压缩,则会在复制期间解压。文件必须是用微软公司的compress.exe或等效工具压缩的。 返回值:如执行成功,返回目标文件的大小,以字节为单位。如执行出错,会返回小于零的一个常数,如下表:LZERROR_BADINHANDLE 源文件无效;LZERROR_BADOUTHANDLE 目标文件无效;LZERROR_GLOBALLOC 内部解压缓冲区内存容量不足;LZERROR_GLOBLOCK 内部解压缓冲区的句柄无效;LZERROR_READ 无效的源文件格式;LZERROR_UNKNOWNALG 解压DLL不能识别源文件采用的压缩算法;LZERROR_WRITE 在磁盘上写入输出文件时出错,通常是由于磁盘空间不足造成的。 _LZ初始化() 这个函数用于初始化内部缓冲区。对一个给出打开文件句柄的一个文件进行解压时,将用到这个缓冲区。注意完成后一定用LZClose关闭这个句柄。最多只能同时打开16个压缩文件句柄 。返回值:由lz32.dll库使用的、那个文件的一个特殊句柄。这个文件句柄兼容于LZCopy, CopyLZFiles, LZRead 和 LZSeek函数。如果出错,该函数会返回下表列出的出错代码之一:LZERROR_BADINHANDLE 源文件无效;LZERROR_BADOUTHANDLE 目标文件无效;LZERROR_GLOBALLOC 内部解压缓冲区内存容量不足;LZERROR_GLOBLOCK 内部解压缓冲区的句柄无效;LZERROR_READ 无效的源文件格式;LZERROR_UNKNOWNALG 解压DLL不能识别源文件采用的压缩算法 LZERROR_WRITE 在磁盘上写入输出文件时出错,通常是由于磁盘空间不足造成的。 _LZ读() 将数据从文件读入内存缓冲区。如hfFile是一个压缩文件的句柄,同时那个压缩文件是由LZOpenFile 或 LZInit函数打开的,这个函数就会在读入数据的同时对文件进行解压处理。 返回值,实际读入的字节数。如这个数字小于cbread,表明早已抵达了文件的末尾。如出错,返回下表列出的常数之一:LZERROR_BADINHANDLE 源文件无效;LZERROR_BADOUTHANDLE 目标文件无效;LZERROR_GLOBALLOC 内部解压缓冲区内存容量不足;LZERROR_GLOBLOCK 内部解压缓冲区的句柄无效;LZERROR_READ 无效的源文件格式;LZERROR_UNKNOWNALG 解压DLL不能识别源文件采用的压缩算法;LZERROR_WRITE 在磁盘上写入输出文件时出错,通常是由于磁盘空间不足造成的。 _LZ移位() 设置一个文件中进行读写的当前位置。如hfFile是一个压缩文件的句柄,同时那个压缩文件是由LZOpenFile 或 LZInit函数打开的,这个函数就会根据文件的解压版本进行查找。 返回值,返回一个新位置,采用从文件起始处计算的字节偏移量。如出错,返回下表列出的常数之一:LZERROR_BADINHANDLE 源文件无效;LZERROR_BADOUTHANDLE 目标文件无效;LZERROR_GLOBALLOC 内部解压缓冲区内存容量不足;LZERROR_GLOBLOCK 内部解压缓冲区的句柄无效;LZERROR_READ 无效的源文件格式;LZERROR_UNKNOWNALG 解压DLL不能识别源文件采用的压缩算法;LZERROR_WRITE 在磁盘上写入输出文件时出错,通常是由于磁盘空间不足造成的。 _文件映射() 将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射。返回值,文件映射在内存中的起始地址,零表示出错。会设置GetLastError。 注解:dwFileOffsetLow和dwFileOffsetHigh必须反映一个偏移距离,它由系统的内存分配精度决定。例如,假设系统的内存精度是64KB(即最小分配单位是64KB),则这些值必须是64KB的整数倍。大多数应用程序都简单的用零从文件的起始处开始映射。lpBaseAddress也必须是内存分配精度的整数倍。声明中的参数类型为Any,而参数表中都是Long,我也不明白。但关于这个函数的英文资料的确是这样的。 _查询DOS设备() 在Windows NT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况。返回值,零表示出错。如执行成功,返回保存到lpTargetPath的字符数。会设置GetLastError。注解:可用DefineDosDevice函数将映射变成DOS设备名。适用平台:Windows NT。 _注册表关闭键() 关闭系统注册表中的一个项(或键)。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表远程连接() 访问远程系统的部分注册表。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表创建键() 在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项。返回值,,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表删除键() 删除现有项下方一个指定的子项。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表删除值() 删除指定项下方的一个值。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表枚举键() 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。注解:用RegQueryInfoKey判断容纳最长那个项所需的缓冲区长度。 _注册表枚举值() 枚举指定项的值。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表刷新键() 将对项和它的子项作出的改动实际写入磁盘。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表载入键() 从以前用RegSaveKey函数创建的一个文件里装载注册表信息。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表通知键值改变() 注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。适用平台:Windows NT。 _注册表打开键() 打开一个现有的注册表项。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。注解:在NT环境下,这个函数会使用默认的安全参数。 _注册表打开键增强() 打开一个现有的项。在win32下推荐使用这个函数。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。 _注册表查询值() 取得指定项或子项的默认(未命名)值。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。注解:win32应用程序应该使用RegQueryValueEx。lpValue被定义成一个字串,以维持同win16的兼容性(在win16中,值全都是字串)。 _注册表查询值增强() 获取一个项的设置值。返回值,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值