Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题

Posted on

Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题 - Kylin Soong Blog - ITeye技术网站

首页 资讯 论坛 问答 博客 群组 更多 ▼

招聘 搜索

您还未登录 ! 我的应用 登录 注册

Kylin Soong Blog

永久域名 http://kylinsoong.iteye.com/

8顶 0踩

Oracle Start Up 3:Oracle数据库基础| Oracle Start Up 1: 几个概念和Oracle数 ...

2010-10-02

Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题 **

博客分类:

  • DATABASE OracleUP框架数据结构SQL Warming Up:

    本文适合Oracle初学者。
    
    在[Oracle Start Up 1](http://kylinsoong.iteye.com/admin/blogs/775518)中我说了几个概念和Oracle数据库的结构,当然在Oracle Start Up 1 里面主要说明的是Oracle数据库的结构(物理组成和逻辑结构)。
    
    本文解决一个初学者很可能常遇到的问题(我遇到了,花了好久才解决)。
    
    本文一切测试实验基于Oracle 10g 企业版。
    

1. 先描述一个连接Oracle 10g的错误:“shared memory realm does not exist” 如图所示Sqlplus连接时出现这个错误;

关于此错误的详细描述参见:http://kylinsoong.iteye.com/blog/774091,本文最后解决这个问题;

2. Oracle 服务器主要组件分析

下图所示为Oracle服务器主要组件:

如上图所示:Oracle服务器的组件结构,Oracle服务器可以看做由两部分组成:Oracle实例和Oracle数据库,上图被加粗直线分为两个部分,直线上半部分表示Oracle实例,而直线之下表示Oracle数据库。如Oracle Start Up 1中所说,Oracle数据库在物理上可以看做是由不同文件组成的文件系统,从逻辑上可以看做是一个由TableSpace、Segment、Extent、Blocks组成的四维结构;

关于Oracle实例:

  是访问Oracle数据库的一种方法,一个Oracle实例只可以打开一个Oracle数据库;

  由内存和后台进程组成;

  存在于内存中,一个数据库对应一个共享的内存区,共享的内存区被Oracle后台进程所共享;

  建立与客户端的连接(连接到Oracle服务器实质上与Oracle服务器的Oracle实例建立连接)

从以下几个方面分解上图:

(1)Oracle两大进程

用户进程:

  在客户机内存上运行的程序,用来访问Oracle数据库;     

  与数据库实例建立连接,不能直接与数据库直接连接;

  如在客户机上运行的 SQL PLUS,企业管理器;

  用户进程向服务进程提出操作请求;

服务器进程:

  一个直接与数据库服务器对话的进程;

  响应用户进程提出的操作请求,并返回结果;

(2) Oracle的主要内存结构包括两个部分

程序全局区Program Global Area (PGA): 当服务器进程启动的时候分配。

  每个用户连接到Oracle数据库的内存区域;

  当进程建立的时候单独分配;

  当进程终止的时候释放;

  只能用于一个进程,是私有的,不能够共享

系统全局区System Global Area (SGA): 在实例启动的时候分配, 是数据库实例的基本组成部分,从结构框架图中分离出SGA部分如下图:

SGA包括几个内存结构:

  共享池(Shared Pool)
  数据库缓冲区快速缓存(Database Buffer Cache)
  重做日志缓冲区(Redo Log Buffer )

  大池(Large Pool)
  Java池(Java Pool)
  其它结构 (锁(lock)、锁存管理 (latch)、统计数据(statistical data))

SGA几个特性:

  动态分配
  由SGA_MAX_SIZE确定大小
  有时称为共享全局区域(Shared Global Area)
   在SGA内以内存颗粒( granules )进行分配

SGA各内存部分功能键下表:

Library Cache

库快速缓冲区 存储最近使用的SQL和pl/sql语句的信息

共享最近使用过的SQL语句

通过“最近最少使用”( least recently used (LRU) )算法来管理 包括两种结构:共享SQL区和共享PL/SQL区 大小由共享池(Shared Pool)的大小确定 Data Dictionary Cache 数据字典缓冲区 数据库中最近使用过的定义的一个集合 包括数据库文件、表、索引、列、用户、权限、和其它对象的信息 在解析阶段,服务器进程寻找数据字典信息来解析对象的名字和访问权限 把数据字典的信息加载到内存里面,来提高查询和DML(Data Manipulation Language)数据操纵语言语句的反应时间 大小由共享池(Shared Pool)的大小确定 Database Buffer Cache 数据库缓冲区快速缓存 存储从数据文件提取出来的数据块的一个拷贝 当提取数据或者修改数据的时候,能很大的提高性能 通过LRU(Least Recently Used )算法来管理 DB_BLOCK_SIZE决定了主数据块的大小 Redo Log Buffer 重做日志缓冲区 记录了对数据块的所有改变 主要的目的是为了恢复数据库 改变被记录在成为重做目录的对象里面(redo entries) 重做目录(Redo entries)包含重建或者重做改变的信息 大小通过LOG_BUFFER来定义 Java Pool Java池 用于解析java命令 在安装和使用java的时候需要使用 大小确定:JAVA_POOL_SIZE Large Pool 大池 SGA中可选的一块内存区域 减少了共享池(Shared Pool)的负担

(3)Oracle实例的后台进程

感觉挺复杂,将在以后做专门说明;

3.Oracle数据库的启动

要启动和关闭数据库,必须要以具有Oracle 管理员权限的用户登陆,通常也就是以具有SYSDBA权限的用户登陆 启动一个数据库需要三个步骤: (1)、 创建一个Oracle实例(非安装阶段) (2)、 由实例安装数据库(安装阶段) (3)、 打开数据库(打开阶段)

下面从实验的角度来实践这三个阶段:

Step one:以具有Oracle 管理员权限的用户登陆

sqlplus命令 sqlplus /nolog conn USER/PASSWORD as sysdba

截图: Step two:创建一个Oracle实例(非安装阶段) sqlplus命令

startup nomount

截图: 如上所示:NONOUNT选项仅仅创建一个Oracle实例。读取init.ora初始化参数文件、启动后台进程、初始化系统全局区(SGA)。Init.ora文件定义了实例的配置,包括内存结构的大小和启动后台进程的数量和类型等。当实例打开后,系统将显示一个SGA内存结构和大小的列表,如上截图所示

Step three: 由实例安装数据库(安装阶段) 命令: alter database mount;

截图: 该命令创建实例并且安装数据库,但没有打开数据库。Oracle系统读取控制文件中关于数据文件和重作日志文件的内容,但并不打开该文件。

Step four:打开数据库(打开阶段)

命令: alter database open;

截图:

  该命令完成创建实例、安装实例和打开数据库的所有三个步骤。此时数据库使数据文件和重作日志文件在线,通常还会请求一个或者是多个回滚段。这时系统除了可以看到前面Startup Mount方式下的所有提示外,还会给出一个"数据库已经打开"的提示。此时,数据库系统处于正常工作状态,可以接受用户请求。

Note that:

当然可以用用一条命令打开 startup

给出截图: 上图中红色线分开的三部分表示三个启动阶段

4,解决一个问题

  本文一开始提出问题,这里做一解决,为什么会出现那个问题了是因为Oracle数据库没有被启动,解决的方法就是如上面3所示操作打开数据库;

  上述问题表现最直接的一个现象:查看任务管理器下oracle.exe所占内存,当oracle.exe所占内存为几十兆说明Oracle数据库没有启动,正常oracle.exe所占内存如下:

现在还原错误:关闭数据库后连接数据库,查看oracle.exe所占内存 查看内存: 与正常启动时相差比价大,所以总结一下解决“shared memory realm does not exist”方法:

(1)任务管理器中查看oracle.exe所占内存,当oracle.exe所占内存仅为几十兆,说明问题是数据库没有启动

(2)启动Oracle数据库,管理员登录,启动 sqlplus /nolog conn USER/PASSWORD as sysdba startup

PS: shared memory realm does not exist 这个错误我用了好长时间都没有解决主要原因是对数据库太陌生。

现在回想起来这个问题真是有点……

  • 大小: 37.6 KB

  • 大小: 5.4 KB

  • 大小: 2 KB

  • 大小: 6.6 KB

  • 大小: 5.2 KB

  • 大小: 4.5 KB

  • 大小: 4.1 KB

  • 大小: 1.2 KB

  • 大小: 1.2 KB

  • 大小: 4.6 KB

  • 大小: 10 KB

  • 大小: 4 KB

  • 大小: 2.6 KB

  • 查看图片附件 8

0

分享到:

Oracle Start Up 3:Oracle数据库基础| Oracle Start Up 1: 几个概念和Oracle数 ...

评论

发表评论

您还没有登录,请登录后发表评论(快捷键 Alt+S / Ctrl+Enter)

kylinsoong的博客

kylinsoong

搜索本博客

最近访客 >>更多访客

1号拖鞋的博客

1号拖鞋

gong1的博客

gong1 gyx_tc的博客

gyx_tc

zhangyiwen1999的博客

zhangyiwen1999

博客分类

其他分类

存档

SQL排序问题

Posted on

SQL排序问题

CSDN-CSDN社区-Java-Web 开发

收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 SQL排序问题【关于UNION ALL && ORDER BY 】[问题点数:30分,结帖人:KAKUKYOWU]

oracle表分区详解

Posted on

oracle表分区详解

博客登录

用户名: 密 码: 网络技术博客 注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 下载 热点文章 开荒之作《开源运营技术.. 帮助

转载:10

翻译:0 原创:46

推荐博客 天知道的技术博客

http://tianzt.blog.51cto.com/ > 复制链接 邀请加入技术圈 加友情链接

发短消息 相册

技术圈 博客

首页 | 下载 | 技术论坛 | 短消息

博 客

技术圈

51CTO广东省午饭第二届线下聚会 微软公司全球副总裁张亚勤51CTO开博 博主的更多文章>>

oracle表分区详解

2009-07-01 14:24:23

标签:oracle 整理 表分区   [推送到技术圈]

版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 此文从以下几个方面来整理关于分区表的概念及操作:

    1.表空间及分区表的概念
    2.表分区的具体作用

    3.表分区的优缺点
    4.表分区的几种类型及操作方法

    5.对表分区的维护性操作.

(1.) 表空间及分区表的概念

表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。

分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

( 2).表分区的具体作用 Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

什么时候使用分区表: 1、表的大小超过2GB。

2、表中包含历史数据,新的数据被增加都新的分区中。

(3).表分区的优缺点 表分区有以下优点: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

(4).表分区的几种类型及操作方法 一.范围分区: 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。

当使用范围分区时,请考虑以下几个规则: 1、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。

2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。 3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。

例一: 假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:

CREATE TABLE CUSTOMER ( CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME VARCHAR2(30) NOT NULL, LAST_NAME VARCHAR2(30) NOT NULL, PHONE VARCHAR2(15) NOT NULL, EMAIL VARCHAR2(80), STATUS CHAR(1) ) PARTITION BY RANGE (CUSTOMER_ID) ( PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02 ) 例二:按时间划分

CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DATE, TOTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DATE) ( PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,

PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03

) 例三:MAXVALUE

CREATE TABLE RangeTable ( idd INT PRIMARY KEY , iNAME VARCHAR(10), grade INT ) PARTITION BY RANGE (grade) ( PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb, PARTITION part2 VALUES LESS THEN (MAXVALUE) TABLESPACE Part2_tb );

二.列表分区: 该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

例一 CREATE TABLE PROBLEM_TICKETS ( PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR2(2000), CUSTOMER_ID NUMBER(7) NOT NULL, DATE_ENTERED DATE NOT NULL, STATUS VARCHAR2(20) ) PARTITION BY LIST (STATUS) ( PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01, PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02

例二 CREATE TABLE ListTable ( id INT PRIMARY KEY , name VARCHAR (20), area VARCHAR (10) ) PARTITION BY LIST (area) ( PARTITION part1 VALUES ('guangdong','beijing') TABLESPACE Part1_tb, PARTITION part2 VALUES ('shanghai','nanjing') TABLESPACE Part2_tb );

)

三.散列分区: 这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

例一: CREATE TABLE HASH_TABLE ( COL NUMBER(8), INF VARCHAR2(100) ) PARTITION BY HASH (COL) ( PARTITION PART01 TABLESPACE HASH_TS01, PARTITION PART02 TABLESPACE HASH_TS02, PARTITION PART03 TABLESPACE HASH_TS03 )

简写: CREATE TABLE emp ( empno NUMBER (4), ename VARCHAR2 (30), sal NUMBER ) PARTITION BY HASH (empno) PARTITIONS 8 STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

四.组合范围散列分区 这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5),

SALES_DATE DATE, SALES_COST NUMBER(10),

STATUS VARCHAR2(20) )

PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) (

PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009 ( SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ), PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009 ( SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009, SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009 ) )

五.复合范围散列分区: 这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

create table dinya_test ( transaction_id number primary key, item_id number(8) not null, item_description varchar2(300), transaction_date date ) partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) ( partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)), partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)), partition part_03 values less than(maxvalue) );

(5).有关表分区的一些维护性操作: 一、添加分区 以下代码给SALES表添加了一个P3分区 ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

注意:以上添加的分区界限应该高于最后一个分区界限。 以下代码给SALES表的P3分区添加了一个P3SUB1子分区

ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE'); 二、删除分区 以下代码删除了P3表分区:

ALTER TABLE SALES DROP PARTITION P3; 在以下代码删除了P4SUB1子分区:

ALTER TABLE SALES DROP SUBPARTITION P4SUB1; 注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

三、截断分区 截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区: ALTER TABLE SALES TRUNCATE PARTITION P2;

通过以下代码截断子分区: ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;

四、合并分区 合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并: ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;

五、拆分分区 拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。 ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);

六、接合分区(coalesca) 结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区: ALTER TABLE SALES COALESCA PARTITION;

七、重命名表分区 以下代码将P21更改为P2 ALTER TABLE SALES RENAME PARTITION P21 TO P2;

八、相关查询 跨分区查询 select sum( /*) from

(select count(/*) cn from t_table_SS PARTITION (P200709_1) union all

select count(/*) cn from t_table_SS PARTITION (P200709_2) );

查询表上有多少分区 SELECT /* FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'

查询索引信息 select object_name,object_type,tablespace_name,sum(value)

from v$segment_statistics where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'

group by object_name,object_type,tablespace_name order by 4 desc

--显示数据库所有分区表的信息:

select /* from DBA_PART_TABLES

--显示当前用户可访问的所有分区表信息: select /* from ALL_PART_TABLES

--显示当前用户所有分区表的信息:

select /* from USER_PART_TABLES

--显示表分区信息 显示数据库所有分区表的详细分区信息: select /* from DBA_TAB_PARTITIONS

--显示当前用户可访问的所有分区表的详细分区信息:

select /* from ALL_TAB_PARTITIONS

--显示当前用户所有分区表的详细分区信息: select /* from USER_TAB_PARTITIONS

--显示子分区信息 显示数据库所有组合分区表的子分区信息:

select /* from DBA_TAB_SUBPARTITIONS

--显示当前用户可访问的所有组合分区表的子分区信息: select /* from ALL_TAB_SUBPARTITIONS

--显示当前用户所有组合分区表的子分区信息:

select /* from USER_TAB_SUBPARTITIONS

--显示分区列 显示数据库所有分区表的分区列信息: select /* from DBA_PART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的分区列信息:

select /* from ALL_PART_KEY_COLUMNS

--显示当前用户所有分区表的分区列信息: select /* from USER_PART_KEY_COLUMNS

--显示子分区列 显示数据库所有分区表的子分区列信息:

select /* from DBA_SUBPART_KEY_COLUMNS

--显示当前用户可访问的所有分区表的子分区列信息: select /* from ALL_SUBPART_KEY_COLUMNS

--显示当前用户所有分区表的子分区列信息:

select /* from USER_SUBPART_KEY_COLUMNS

--怎样查询出oracle数据库中所有的的分区表 select /* from user_tables a where a.partitioned='YES'

--删除一个表的数据是

truncate table table_name;

--删除分区表一个分区的数据是 alter table table_name truncate partition p5;

本文出自 “天知道的技术博客” 博客,转载请与作者联系!

本文出自 51CTO.COM技术博客 上一篇 WINDOWS 2008 AD权限管理服务(ADRMS)完全攻略  下一篇 windows 2008 AD 操作主机完全攻略

类别:ORACLE技术圈( ) ┆ 阅读( ) ┆ 评论( ) ┆推送到技术圈返回首页

**相关文章**

oracle碎片整理

Oracle 9i在AIX上的性能调整 -- 内存篇 第一篇 Oracle体系结构总览(整理)

登录oracle数据库时常用的操作命令整理 ORACLE公司传奇

Oracle 收购Sun Oracle系统中用户权限的赋予,查看

Oracle数据库字符集 《从实践中学习oracle/SQL》读书笔记 2

Oracle 数据类型及存储方式 文章评论

[1楼] ciorg

2009-07-02 14:53:55 写的算是非常详尽了。不错不错。

短消息通知评论者 [2楼] [匿名]wangbaoqin

2010-02-02 15:14:03 good!

短消息通知评论者

发表评论

昵 称:验证码:  点击图片可刷新验证码请点击后输入验证码 博客过2级,无需填写验证码 内 容:

ttzztt

博客统计信息

51cto推荐博客 用户名:ttzztt 文章数:56 评论数:77 访问量:39073 无忧币:656 博客积分:1101 博客等级:5 注册日期:2008-08-24 距离博客争夺赛结束还有13 天 热门文章

搜索本博客内文章 最新评论

[ttzztt](http://tianzt.blog.51cto.com/):逻辑的DG是以物理的为基础的,做好..

[wiliiwin](http://wiliiwin.blog.51cto.com/):哦原来是这样 明白了 最近做了rac集.. [ttzztt](http://tianzt.blog.51cto.com/):这个实验的目的就是摸拟主从切换,..

[wiliiwin](http://wiliiwin.blog.51cto.com/):我就问下了 你文章都说主库都当机了.. [lqlaps169](http://lqlaps169.blog.51cto.com/):顶一下

[lqlaps169](http://lqlaps169.blog.51cto.com/):顶一下 [lqlaps169](http://lqlaps169.blog.51cto.com/):Good,有很好的参考价值。

[hepanming007](http://xiaomaweb.blog.51cto.com/):thanks very much!

51CTO推荐博文

Copyright By 51CTO.COM 版权所有

Google Spanner原理

Posted on

Google Spanner原理- 全球级的分布式数据库

关闭

晒昔日的“散片”记录

EMC中国研究院

**890 这是EMC中国研究院的官方轻博客, 主要关注于云计算和大数据。 EMC 大数据 云计算 招聘 EMC中国研究院 Hadoop Greenplum 数据挖掘 存储 PaaS

2012 09/18

Google Spanner原理- 全球级的分布式数据库

标签:大数据云计算 Google Spanner简介

Spanner 是Google的全球级的分布式数据库 (Globally-Distributed Database) 。Spanner的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数已百计的数据中心,上万亿的行。更给力的是,除了夸张的扩展性之外,他还能同时通过同步复制和多版本来满足外部一致性,可用性也是很好的。冲破CAP的枷锁,在三者之间完美平衡。

Google Spanner原理- 全球级的分布式数据库

查看大图

Spanner是个可扩展,多版本,全球分布式还支持同步复制的数据库。他是Google的第一个可以全球扩展并且支持外部一致的事务。Spanner能做到这些,离不开一个用GPS和原子钟实现的时间API。这个API能将数据中心之间的时间同步精确到10ms以内。因此有几个给力的功能:无锁读事务,原子schema修改,读历史数据无block。

EMC中国研究院实时紧盯业界动态,Google最近发布的一篇论文《Spanner: Google's Globally-Distributed Database》, 笔者非常感兴趣,对Spanner进行了一些调研,并在这里分享。由于Spanner并不是开源产品,笔者的知识主要来源于Google的公开资料,通过现有公开资料仅仅只能窥得Spanner的沧海一粟,Spanner背后还依赖有大量Google的专有技术。

下文主要是Spanner的背景,设计和并发控制。

Spanner背景

要搞清楚Spanner原理,先得了解Spanner在Google的定位。

Google Spanner原理- 全球级的分布式数据库

查看大图

从上图可以看到。Spanner位于F1和GFS之间,承上启下。所以先提一提F1和GFS。

F1

和众多互联网公司一样,在早期Google大量使用了Mysql。Mysql是单机的,可以用Master-Slave来容错,分区来扩展。但是需要大量的手工运维工作,有很多的限制。因此Google开发了一个可容错可扩展的RDBMS——F1。和一般的分布式数据库不同,F1对应RDMS应有的功能,毫不妥协。起初F1是基于Mysql的,不过会逐渐迁移到Spanner。

F1有如下特点:

· 7×24高可用。哪怕某一个数据中心停止运转,仍然可用。

· 可以同时提供强一致性和弱一致。

· 可扩展

· 支持SQL

· 事务提交延迟50-100ms,读延迟5-10ms,高吞吐

众所周知Google BigTable是重要的NoSql产品,提供很好的扩展性,开源世界有HBase与之对应。为什么Google还需要F1,而不是都使用BigTable呢?因为BigTable提供的最终一致性,一些需要事务级别的应用无法使用。同时BigTable还是NoSql,而大量的应用场景需要有关系模型。就像现在大量的互联网企业都使用Mysql而不愿意使用HBase,因此Google才有这个可扩展数据库的F1。而Spanner就是F1的至关重要的底层存储技术。

Colossus(GFS II)

Colossus也是一个不得不提起的技术。他是第二代GFS,对应开源世界的新HDFS。GFS是著名的分布式文件系统。

Google Spanner原理- 全球级的分布式数据库

查看大图

初代GFS是为批处理设计的。对于大文件很友好,吞吐量很大,但是延迟较高。所以使用他的系统不得不对GFS做各种优化,才能获得良好的性能。那为什么Google没有考虑到这些问题,设计出更完美的GFS ?因为那个时候是2001年,Hadoop出生是在2007年。如果Hadoop是世界领先水平的话,GFS比世界领先水平还领先了6年。同样的Spanner出生大概是2009年,现在我们看到了论文,估计Spanner在Google已经很完善,同时Google内部已经有更先进的替代技术在酝酿了。笔者预测,最早在2015年才会出现Spanner和F1的山寨开源产品。

Colossus是第二代GFS。Colossus是Google重要的基础设施,因为他可以满足主流应用对FS的要求。Colossus的重要改进有:

· 优雅Master容错处理 (不再有2s的停止服务时间)

· Chunk大小只有1MB (对小文件很友好)

· Master可以存储更多的Metadata(当Chunk从64MB变为1MB后,Metadata会扩大64倍,但是Google也解决了)

Colossus可以自动分区Metadata。使用Reed-Solomon算法来复制,可以将原先的3份减小到1.5份,提高写的性能,降低延迟。客户端来复制数据。具体细节笔者也猜不出。

与BigTable, Megastore对比

Spanner主要致力于跨数据中心的数据复制上,同时也能提供数据库功能。在Google类似的系统有BigTable和Megastore。和这两者相比,Spanner又有什么优势呢。

BigTable在Google得到了广泛的使用,但是他不能提供较为复杂的Schema,还有在跨数据中心环境下的强一致性。Megastore有类RDBMS的数据模型,同时也支持同步复制,但是他的吞吐量太差,不能适应应用要求。Spanner不再是类似BigTable的版本化 key-value存储,而是一个“临时多版本”的数据库。何为“临时多版本”,数据是存储在一个版本化的关系表里面,存储的时间数据会根据其提交的时间打上时间戳,应用可以访问到较老的版本,另外老的版本也会被垃圾回收掉。

Google官方认为 Spanner是下一代BigTable,也是Megastore的继任者。

Google Spanner设计

功能

从高层看Spanner是通过Paxos状态机将分区好的数据分布在全球的。数据复制全球化的,用户可以指定数据复制的份数和存储的地点。Spanner可以在集群或者数据发生变化的时候将数据迁移到合适的地点,做负载均衡。用户可以指定将数据分布在多个数据中心,不过更多的数据中心将造成更多的延迟。用户需要在可靠性和延迟之间做权衡,一般来说复制1,2个数据中心足以保证可靠性。

作为一个全球化分布式系统,Spanner提供一些有趣的特性。

· 应用可以细粒度的指定数据分布的位置。精确的指定数据离用户有多远,可以有效的控制读延迟(读延迟取决于最近的拷贝)。指定数据拷贝之间有多远,可以控制写的延迟(写延迟取决于最远的拷贝)。还要数据的复制份数,可以控制数据的可靠性和读性能。(多写几份,可以抵御更大的事故)

· Spanner还有两个一般分布式数据库不具备的特性:读写的外部一致性,基于时间戳的全局的读一致。这两个特性可以让Spanner支持一致的备份,一致的MapReduce,还有原子的Schema修改。

这写特性都得益有Spanner有一个全球时间同步机制,可以在数据提交的时候给出一个时间戳。因为时间是系列化的,所以才有外部一致性。这个很容易理解,如果有两个提交,一个在T1,一个在T2。那有更晚的时间戳那个提交是正确的。

这个全球时间同步机制是用一个具有GPS和原子钟的TrueTime API提供了。这个TrueTime API能够将不同数据中心的时间偏差缩短在10ms内。这个API可以提供一个精确的时间,同时给出误差范围。Google已经有了一个TrueTime API的实现。笔者觉得这个TrueTimeAPI 非常有意义,如果能单独开源这部分的话,很多数据库如MongoDB都可以从中受益。 体系结构

Spanner由于是全球化的,所以有两个其他分布式数据库没有的概念。

· Universe。一个Spanner部署实例称之为一个Universe。目前全世界有3个。一个开发,一个测试,一个线上。因为一个Universe就能覆盖全球,不需要多个。

· Zones. 每个Zone相当于一个数据中心,一个Zone内部物理上必须在一起。而一个数据中心可能有多个Zone。可以在运行时添加移除Zone。一个Zone可以理解为一个BigTable部署实例。

Google Spanner原理- 全球级的分布式数据库

查看大图

如图所示。一个Spanner有上面一些组件。实际的组件肯定不止这些,比如TrueTime API Server。如果仅仅知道这些知识,来构建Spanner是远远不够的。但Google都略去了。那笔者就简要介绍一下。

· Universemaster: 监控这个universe里zone级别的状态信息

· Placement driver:提供跨区数据迁移时管理功能

· Zonemaster:相当于BigTable的Master。管理Spanserver上的数据。

· Location proxy:存储数据的Location信息。客户端要先访问他才知道数据在那个Spanserver上。

· Spanserver:相当于BigTable的ThunkServer。用于存储数据。

可以看出来这里每个组件都很有料,但是Google的论文里只具体介绍了Spanserver的设计,笔者也只能介绍到这里。下面详细阐述Spanserver的设计。

Spanserver

本章详细介绍Spanserver的设计实现。Spanserver的设计和BigTable非常的相似。参照下图

Google Spanner原理- 全球级的分布式数据库

查看大图

从下往上看。每个数据中心会运行一套Colossus (GFS II) 。每个机器有100-1000个tablet。Tablet概念上将相当于数据库一张表里的一些行,物理上是数据文件。打个比方,一张1000行的表,有10个tablet,第1-100行是一个tablet,第101-200是一个tablet。但和BigTable不同的是BigTable里面的tablet存储的是Key-Value都是string,Spanner存储的Key多了一个时间戳:

(Key: string, timestamp: int64) ->string。

因此spanner天生就支持多版本,tablet在文件系统中是一个B-tree-like的文件和一个write-ahead日志。

每个Tablet上会有一个Paxos状态机。Paxos是一个分布式一致性协议。Table的元数据和log都存储在上面。Paxos会选出一个replica做leader,这个leader的寿命默认是10s,10s后重选。Leader就相当于复制数据的master,其他replica的数据都是从他那里复制的。读请求可以走任意的replica,但是写请求只有去leader。这些replica统称为一个paxos group。

每个leader replica的spanserver上会实现一个lock table还管理并发。Lock table记录了两阶段提交需要的锁信息。但是不论是在Spanner还是在BigTable上,但遇到冲突的时候长时间事务会将性能很差。所以有一些操作,如事务读可以走lock table,其他的操作可以绕开lock table。

每个leader replica的spanserver上还有一个transaction manager。如果事务在一个paxos group里面,可以绕过transaction manager。但是一旦事务跨多个paxos group,就需要transaction manager来协调。其中一个Transactionmanager被选为leader,其他的是slave听他指挥。这样可以保证事务。

Directories and Placement

之所以Spanner比BigTable有更强的扩展性,在于Spanner还有一层抽象的概念directory, directory是一些key-value的集合,一个directory里面的key有一样的前缀。更妥当的叫法是bucketing。Directory是应用控制数据位置的最小单元,可以通过谨慎的选择Key的前缀来控制。据此笔者可以猜出,在设计初期,Spanner是作为F1的存储系统而设立,甚至还设计有类似directory的层次结构,这样的层次有很多好处,但是实现太复杂被摒弃了。

Directory作为数据放置的最小单元,可以在paxos group里面移来移去。Spanner移动一个directory一般出于如下几个原因:

· 一个paxos group的负载太大,需要切分

· 将数据移动到access更近的地方

· 将经常同时访问的directory放到一个paxos group里面 Directory可以在不影响client的前提下,在后台移动。移动一个50MB的directory大概需要的几秒钟。

那么directory和tablet又是什么关系呢。可以理解为Directory是一个抽象的概念,管理数据的单元;而tablet是物理的东西,数据文件。由于一个Paxos group可能会有多个directory,所以spanner的tablet实现和BigTable的tablet实现有些不同。BigTable的tablet是单个顺序文件。Google有个项目,名为Level DB,是BigTable的底层,可以看到其实现细节。而Spanner的tablet可以理解是一些基于行的分区的容器。这样就可以将一些经常同时访问的directory放在一个tablet里面,而不用太在意顺序关系。

在paxos group之间移动directory是后台任务。这个操作还被用来移动replicas。移动操作设计的时候不是事务的,因为这样会造成大量的读写block。操作的时候是先将实际数据移动到指定位置,然后再用一个原子的操作更新元数据,完成整个移动过程。

Directory还是记录地理位置的最小单元。数据的地理位置是由应用决定的,配置的时候需要指定复制数目和类型,还有地理的位置。比如(上海,复制2份;南京复制1分) 。这样应用就可以根据用户指定终端用户实际情况决定的数据存储位置。比如中国队的数据在亚洲有3份拷贝, 日本队的数据全球都有拷贝。 前面对directory还是被简化过的,还有很多无法详述。

数据模型

Spanner的数据模型来自于Google内部的实践。在设计之初,Spanner就决心有以下的特性:

· 支持类似关系数据库的schema

· Query语句

· 支持广义上的事务

为何会这样决定呢?在Google内部还有一个Megastore,尽管要忍受性能不够的折磨,但是在Google有300多个应用在用它,因为Megastore支持一个类似关系数据库的schema,而且支持同步复制 (BigTable只支持最终一致的复制) 。使用Megastore的应用有大名鼎鼎的Gmail, Picasa, Calendar, Android Market和AppEngine。 而必须对Query语句的支持,来自于广受欢迎的Dremel,笔者不久前写了篇文章来介绍他。 最后对事务的支持是比不可少了,BigTable在Google内部被抱怨的最多的就是其只能支持行事务,再大粒度的事务就无能为力了。Spanner的开发者认为,过度使用事务造成的性能下降的恶果,应该由应用的开发者承担。应用开发者在使用事务的时候,必须考虑到性能问题。而数据库必须提供事务机制,而不是因为性能问题,就干脆不提供事务支持。

数据模型是建立在directory和key-value模型的抽象之上的。一个应用可以在一个universe中建立一个或多个database,在每个database中建立任意的table。Table看起来就像关系型数据库的表。有行,有列,还有版本。Query语句看起来是多了一些扩展的SQL语句。

Spanner的数据模型也不是纯正的关系模型,每一行都必须有一列或多列组件。看起来还是Key-value。主键组成Key,其他的列是Value。但这样的设计对应用也是很有裨益的,应用可以通过主键来定位到某一行。

Google Spanner原理- 全球级的分布式数据库

查看大图

上图是一个例子。对于一个典型的相册应用,需要存储其用户和相册。可以用上面的两个SQL来创建表。Spanner的表是层次化的,最顶层的表是directory table。其他的表创建的时候,可以用interleave in parent来什么层次关系。这样的结构,在实现的时候,Spanner可以将嵌套的数据放在一起,这样在分区的时候性能会提升很多。否则Spanner无法获知最重要的表之间的关系。

TrueTime

Google Spanner原理- 全球级的分布式数据库

查看大图

TrueTime API 是一个非常有创意的东西,可以同步全球的时间。上表就是TrueTime API。TT.now()可以获得一个绝对时间TTinterval,这个值和UnixTime是相同的,同时还能够得到一个误差e。TT.after(t)和TT.before(t)是基于TT.now()实现的。

那这个TrueTime API实现靠的是GFS和原子钟。之所以要用两种技术来处理,是因为导致这两个技术的失败的原因是不同的。GPS会有一个天线,电波干扰会导致其失灵。原子钟很稳定。当GPS失灵的时候,原子钟仍然能保证在相当长的时间内,不会出现偏差。

实际部署的时候。每个数据中心需要部署一些Master机器,其他机器上需要有一个slave进程来从Master同步。有的Master用GPS,有的Master用原子钟。这些Master物理上分布的比较远,怕出现物理上的干扰。比如如果放在一个机架上,机架被人碰倒了,就全宕了。另外原子钟不是并很贵。Master自己还会不断比对,新的时间信息还会和Master自身时钟的比对,会排除掉偏差比较大的,并获得一个保守的结果。最终GPS master提供时间精确度很高,误差接近于0。

每个Slave后台进程会每个30秒从若干个Master更新自己的时钟。为了降低误差,使用Marzullo算法。每个slave还会计算出自己的误差。这里的误差包括的通信的延迟,机器的负载。如果不能访问Master,误差就会越走越大,知道重新可以访问。

Google Spanner并发控制

Spanner使用TrueTime来控制并发,实现外部一致性。支持以下几种事务。

· 读写事务

· 只读事务

· 快照读,客户端提供时间戳

· 快照读,客户端提供时间范围

例如一个读写事务发生在时间t,那么在全世界任何一个地方,指定t快照读都可以读到写入的值。

Google Spanner原理- 全球级的分布式数据库

查看大图

上表是Spanner现在支持的事务。单独的写操作都被实现为读写事务 ; 单独的非快照被实现为只读事务。事务总有失败的时候,如果失败,对于这两种操作会自己重试,无需应用自己实现重试循环。

时间戳的设计大大提高了只读事务的性能。事务开始的时候,要声明这个事务里没有写操作,只读事务可不是一个简单的没有写操作的读写事务。它会用一个系统时间戳去读,所以对于同时的其他的写操作是没有Block的。而且只读事务可以在任意一台已经更新过的replica上面读。

对于快照读操作,可以读取以前的数据,需要客户端指定一个时间戳或者一个时间范围。Spanner会找到一个已经充分更新好的replica上读取。

还有一个有趣的特性的是,对于只读事务,如果执行到一半,该replica出现了错误。客户端没有必要在本地缓存刚刚读过的时间,因为是根据时间戳读取的。只要再用刚刚的时间戳读取,就可以获得一样的结果。

读写事务

正如BigTable一样,Spanner的事务是会将所有的写操作先缓存起来,在Commit的时候一次提交。这样的话,就读不出在同一个事务中写的数据了。不过这没有关系,因为Spanner的数据都是有版本的。

在读写事务中使用wound-wait算法来避免死锁。当客户端发起一个读写事务的时候,首先是读操作,他先找到相关数据的leader replica,然后加上读锁,读取最近的数据。在客户端事务存活的时候会不断的向leader发心跳,防止超时。当客户端完成了所有的读操作,并且缓存了所有的写操作,就开始了两阶段提交。客户端闲置一个coordinator group,并给每一个leader发送coordinator的id和缓存的写数据。

leader首先会上一个写锁,他要找一个比现有事务晚的时间戳。通过Paxos记录。每一个相关的都要给coordinator发送他自己准备的那个时间戳。

Coordinatorleader一开始也会上个写锁,当大家发送时间戳给他之后,他就选择一个提交时间戳。这个提交的时间戳,必须比刚刚的所有时间戳晚,而且还要比TT.now()+误差时间 还有晚。这个Coordinator将这个信息记录到Paxos。

在让replica写入数据生效之前,coordinator还有再等一会。需要等两倍时间误差。这段时间也刚好让Paxos来同步。因为等待之后,在任意机器上发起的下一个事务的开始时间,都比如不会比这个事务的结束时间早了。然后coordinator将提交时间戳发送给客户端还有其他的replica。他们记录日志,写入生效,释放锁。

只读事务

对于只读事务,Spanner首先要指定一个读事务时间戳。还需要了解在这个读操作中,需要访问的所有的读的Key。Spanner可以自动确定Key的范围。

如果Key的范围在一个Paxos group内。客户端可以发起一个只读请求给group leader。leader选一个时间戳,这个时间戳要比上一个事务的结束时间要大。然后读取相应的数据。这个事务可以满足外部一致性,读出的结果是最后一次写的结果,并且不会有不一致的数据。

如果Key的范围在多个Paxos group内,就相对复杂一些。其中一个比较复杂的例子是,可以遍历所有的group leaders,寻找最近的事务发生的时间,并读取。客户端只要时间戳在TT.now().latest之后就可以满足要求了。

最后的话

本文介绍了GoogleSpanner的背景,设计和并发控制。希望不久的将来,会有开源产品出现。

关于作者


Google Spanner原理- 全球级的分布式数据库

查看大图


颜开,EMC中国研究院研究员,关注大数据,云计算等领域

博客: http://weibo.com/yankaycom

melburg很喜欢此内容08月1日 举报

来个中文昵称[赞]07月12日 举报

明月照疆[good]07月8日 举报

想要成攻的小C君顶一下!06月15日 举报

耐心的伴月觉得这很赞06月9日 举报

foyo23赞!05月7日 举报

纷纷说太赞了,描述的太好了。数据存储领域真是一个藏龙卧虎之地,不仅有很牛叉的技术,还有很多牛叉的技术人员!04月23日 举报

纷纷说喜欢了你的内容04月23日 举报

慕斯DBN喜欢了你的内容03月28日 举报

水木一南顶!03月18日 举报

柯小小西喜欢!03月11日 举报

金剛之義[赞]03月7日 举报

kyssley-副本赞!01月31日 举报

_ajwang[good]01月31日 举报

ahhuiyang赞!01月19日 举报

小球球滚了喜欢!01月13日 举报

Jerry_King_D[赞]01月9日 举报

jundederr赞!01月3日 举报

陈正禧[good]2012年12月28日 举报

徐风Alfred顶!2012年12月17日 举报

这些人喜欢过

  • melburg
  • 来个中文昵称
  • 明月照疆
  • 想要成攻的小C君
  • 耐心的伴月
  • foyo23
  • 纷纷说
  • 慕斯DBN
  • 水木一南
  • 柯小小西
  • 金剛之義
  • kyssley-副本
  • _ajwang
  • ahhuiyang
  • 小球球滚了
  • Jerry_King_D
  • jundederr
  • 陈正禧
  • 徐风Alfred
  • 沈中华
  • Formating
  • 萌到爆
  • 姜博not博士
  • oldratlee

首页 我的365 归档页

了解Qing更多精彩登录注册

  • 飞在德国
  • LoliBuG
  • 吃口香糖的兔子
  • LinSioE
  • 邪恶GIF精选
  • mlito
  • F1画报
  • LOOKBOOKin丨时尚画报
  • 巴黎女人的衣橱
  • 汽车海报
  • 双鱼KIKI
  • -靡靡-
  • 设计分享团
  • Smoke_君仔
  • 自在艺品
  • 看得见风景的记忆
  • 香水爱时尚
  • 龍門lonmain
  • 阿嗲了娘嘞
  • 段子ROCK
  • cugala
  • 墨海潮生
  • tony柚子chang
  • 沈负心
  • 星星418糖糖
  • 天沐良宁
  • 欧美时尚掠影
  • Flyinsky88 发现更多>>

    为了保护你的账号安全,请输入验证码进行登录

验证码:换一张

登录

TOP 关闭添加标签**常用标签**

完成

虚拟机软件VMware Workstation 10官方正式版(附序列号)

Posted on

虚拟机软件VMware Workstation 10官方正式版(附序列号)

虚拟机软件VMware Workstation 10官方正式版(附序列号)

在 虚拟机软件中VMware Workstation算是一款非常强大较稳定的软件了,今天 VMware Workstation 10.0正式发布了,最让人欣喜的是该版本终于有了简体中 文版了,从现在开始我们可以抛弃掉那个汉化包了,当然VMware Workstation 10.0不仅仅是有了简体中文这么简单,他支持Windows 8、平板电脑传感器和即 将过期的虚拟机,可使你的工作无缝、直观、更具关联性。

可以将Windows 8.1物理PC转变为虚拟机;Unity模式增强,与Windows 8.1 UI 更改无缝配合工作;

·加强控制,虚拟机将以指定的时间间隔查询服务器,从而将受限虚拟机的策略 文件中的当前系统时间存储为最后受信任的时间戳;

·在平板电脑运行时可以利用加速计、陀螺仪、罗盘以及环境光线传感器;

·支持多达16个虚拟CPU、8 TB SATA磁盘和64 GB RAM;

·新的虚拟SATA磁盘控制器;

·现在支持20个虚拟网络;

·USB3流支持更快的文件复制;

·改进型应用和Windows虚拟机启动时间;

·固态磁盘直通;

·增加多监视设置;

·VMware-KVM 提供了使用多个虚拟机的新界面。

PS:本版原生自带简体。不需要再汉化!

直观、更具关联性。

VMware Workstation 10.0下载地址:

https://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.0-1295980.exe

**VMware Workstation 10.0.1官方中文下载地址: http://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.1-1379776.exe**

VMware-workstation-full-10keygen注册机 http://www.400gb.com/file/29264846

VMware Workstation 10.0下载地址:

http://pan.baidu.com/share/link?shareid=3806157122&uk=1126415953 注册机下载:http://pan.baidu.com/share/link?shareid=3865501324&uk=1126415953

永久Key: 5F29M-48312-8ZDF9-A8A5K-2AM0Z

KEY:

M109C-N0J5L-08J8A-02ARP-CE64F

4F207-8HJ1M-WZCP8-000N0-92Q6G

0A6Z5-8H1EJ-WZCL1-PK072-23DJG

0F0Q9-8F38L-RZXT9-4U054-ACW5F

JA02E-09H47-QZD81-W3A52-A3014

4F2AG-A0HEJ-JZWH8-L01N6-8C3Q3

Windows版:http://download3.vmware.com/software/wkst/file/VMware-workstation-full-10.0.0-1295980.exe linux x86:http://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-10.0.0-1295980.i386.bundle linux x64:http://download3.vmware.com/software/wkst/file/VMware-Workstation-Full-10.0.0-1295980.x86_64.bundle

VMware Player 是最简单的虚拟机,VMware Player 是在 PC 上同时运行多个操作系统的最简单方法。玩虚拟机,首选VMware Player。

推荐理由:①它是VMware Workstation的官方精简版,更适合个人用户使用。

②免费。

③体积小,仅100MB多一点。

④主界面清爽简洁,几乎所有的功能都不需要手工设置。

⑤对软驱、光驱、蓝牙和USB设备有很完善的支持。

⑥Player不仅对系统版本没有要求,对硬件也没有硬性要求,基本上是PC都能使用。

⑦同时支持32位64位主机和虚拟。⑧虚拟系统完美支持Aero(磨砂玻璃特效),支持DirectX 9 3D加速。

直接下载链接:

VMware Player and VMware Player Plus 6.0: https://download3.vmware.com/software/player/file/VMware-player-6.0.0-1295980.exe?HashKey=994a6ddfe8e1940e452647db8f3cdc71&ext=.exe?ms=%7B%22sourcefilesize%22%3A%2294M%22%2C%22dlgcode%22%3A%22PLAYER-600-A%22%2C%22languagecode%22%3A%22en%22%2C%22source%22%3A%22DOWNLOADS%22%2C%22downloadtype%22%3A%22manual%22%2C%22eula%22%3A%22N%22%2C%22downloaduuid%22%3A%2292dda063-afb8-40dc-a50c-671a3a5ef5af%22%2C%22purchased%22%3A%22N%22%2C%22dlgtype%22%3A%22Product+Binaries%22%2C%22productversion%22%3A%226.0.0%22%2C%22productfamily%22%3A%22VMware+Player%22%7D&AuthKey=1378333450_30aa6b9f4407f895514881ad175ec6c5&ext=.exe

VMware Player and VMware Player Plus 6.0 for Linux 32-bit: https://download3.vmware.com/software/player/file/VMware-Player-6.0.0-1295980.i386.bundle?HashKey=8c92f19c9ff5623e93a5147d6002ec06&params=%7B%22sourcefilesize%22%3A%22222M%22%2C%22dlgcode%22%3A%22PLAYER-600-A%22%2C%22languagecode%22%3A%22en%22%2C%22source%22%3A%22DOWNLOADS%22%2C%22downloadtype%22%3A%22manual%22%2C%22eula%22%3A%22N%22%2C%22downloaduuid%22%3A%22de2df9e1-680d-4d64-bd7b-c203cb51a19b%22%2C%22purchased%22%3A%22N%22%2C%22dlgtype%22%3A%22Product+Binaries%22%2C%22productversion%22%3A%226.0.0%22%2C%22productfamily%22%3A%22VMware+Player%22%7D&AuthKey=1378333645_ba275adf24b7a3b1ce04b323d6950883

VMware Player and VMware Player Plus 6.0 for Linux 64-bit: https://download3.vmware.com/software/player/file/VMware-Player-6.0.0-1295980.x86_64.bundle?HashKey=eadb3587f1992b4c34d5c3beffe6cb56?ms=%7B%22sourcefilesize%22%3A%22191M%22%2C%22dlgcode%22%3A%22PLAYER-600-A%22%2C%22languagecode%22%3A%22en%22%2C%22source%22%3A%22DOWNLOADS%22%2C%22downloadtype%22%3A%22manual%22%2C%22eula%22%3A%22N%22%2C%22downloaduuid%22%3A%2280b2e8d4-4df6-41c4-bd77-1ab496c5f317%22%2C%22purchased%22%3A%22N%22%2C%22dlgtype%22%3A%22Product+Binaries%22%2C%22productversion%22%3A%226.0.0%22%2C%22productfamily%22%3A%22VMware+Player%22%7D&AuthKey=1378333902_17241d1228dcb4406283ef18d19ca38d