在AnySQL.net中搜索标签(Tags) 'MySQL' 的结果:
不用MySQL的14个理由
MySQL正如日中天, 不了国外有人发表了不用MySQL的14个理由, 在这儿我意译了一下. 折扣让许可证费或服务费不再是问题. 不必在意是否具有你并不需要的功能. 管理少量大型数据库比大量MySQL简单. 如果跑在Windows上, 为什么不用SQL Server? 过去,SQL Server是很优良的中型数据库. 微软对SQL Server管理工具作了很大改进. Oracle也简化了很多数据库的工具和管理. 都提供便宜或免费的版本, 升级时兼容性也好. 业务增长很快时, 不如及早上大型数据库. 很多或更好的数据类型支持. MySQL上出现的问题更多. MySQL的一些特有的功能, 并没有做得很好. 传统数据库有更多更好的第三方软件支持. 没有因为推荐用传统数据库而被开除. 当然招致了很多人的反驳, 还一条一条地反驳呢, 就在回复里面, 英文水平有限, 不意译了, 自已看吧. 不过, 一开始的选择的确需要慎重....
在Perl中用Array DML来进行性能调优
asyncdata是一个用于同步数据的角本, 基于实体化视图日志或自定义的触发器来获得变更的记录, 然后防照实体化视图刷新的过程来进行数据同步. 几个月之前完成的这一段角本, 现在要拿来作一些数据的迁移用了. 除正确性外, 性能就是最关键的因素了. 在处理SELECT的结果时, 我们已经广泛地使用Array Fetch提升性能了, 不过Array DML真正用得还是不够广的, 相对来说, 在PL/SQL中用得多一些. 现在我要测试的是在Perl中测试Array DML的性能提升. 做的测试是在两个不同的数据中心间进行数据同步, 网络速度肯定是不够快的, 在不用Array DML的情况下, 源节点这边插入一万条记录(表有13个字段, 一个主键索引), 用Perl同步到目标数据库需要40秒, 用dblink的结果更差, 需要一分钟左右. 通过升级DBD Oracle后, 用Array DML方式处理这一万条刻录时(Array Size为500), 只用了4秒钟, 整个速度提升了10倍, 应当可以满足性能要求了. ...
向MySQL学习, AnySQL可以纵向显示结果记录
Huang Yong在接触MySQL后, 一直建议我在AnySQL中增加这个功能, 不过这一两个月来没有理他, 一直没有加上此功能, 今天好象良心发现, 加上去吧! 毕竟他现在坐得离我比较近. ASQL> select * from tab where rownum < 5; TNAME TABTYPE CLUSTERID ---------- ------- --------- BONUS TABLE CLU_A CLUSTER CR_5043802 TABLE DEPT TABLE 4 rows returned. 接下来要从从USER_OBJECTS中去查某个表的信息, 可是列太多了, 横向显示不方便啊! 你可以查询语句后面加上"/g","/G","\G","\g"中的任何一个, 将结果变为纵向显示....
MySQL的绑定(Bind)变量和Query Cache
在MySQL中并没有Shared Pool来共享SQL及其执行计划, 因此是否共享不是很重要, 在程序中是否使用绑定(Bind)变量也不是很重要. 事实上在目前的版本中, 只有Server Side的编程才能使用绑定变量, 而客户端的程序虽然用了绑定变量, 但实际是上只是被进行了文本替换, 最早我在MySQL的JDBC驱动说明上看到了这一点, 现在用Perl程序(asyncdata.pl)从Oracle向MySQL复制数据时(启动MySQL时指定--log选项)从SQL的日志文件中看到如下记录: Query DELETE FROM T_OBJECTS WHERE OBJECT_ID='441766' AND 1=1 Query DELETE FROM T_OBJECTS WHERE OBJECT_ID='441767' AND 1=1 Query DELETE FROM T_OBJECTS WHERE OBJECT_ID='441768' AND 1=1 而根据MySQL的解释,...
MySQL中的LogMiner工具 -- mysqlbinlog
在MySQL中binlog的作用和Oracle中的归档日志类似, Oracle中提供了DBMS_LOGMNR来对日志文件进行分析, 来解出Redo SQL和Undo SQL, MySQL中也提供了一个名为mysqlbinlog的工具, 用来解释或取出存放在binlog中的SQL语句, 有没有Undo SQL我到是没有研究过. 最基本的使用语法如下: mysqlbinlog [options] log_file ... 在选项中, 可以指定一些过滤条件, 来解出你所想用的东西, 这样的选项有: --database=db_name, -d db_name --offset=N, -o N --[start|stop]-datetime=datetime --[start|stop]-position=N 解出来的就是一条一条SQL语句了, 将这些语句执行一下, 就等于增量恢复了, 估计不是用绑定变量的, 可能在MySQL中是不是绑定变量不是很重要了. 当然重要的一点是不要运行多个进程去跑, 因为这样的话, 顺序就得不到保证了....
MySQL的binlog, InnoDB的日志和Oracle的日志
MySQL中有一个binlog的概念, 用于保存对数据库所作的修改, 这点上和Oracle的归档日志很接近, 但在原理上是很不一样的. 以InnoDB为例, InnoDB本身就有log文件, 和Oracle的联机日志一样, 用完了就重用, 但binlog并不是InnoDB的日志在重用前的拷贝, 而是另外写了一个文件. 因为binlog并不是专门为InnoDB设计的, 其他的存贮引挚如MyISAM也支持binlog, 它是MySQL备份及复制支持的重要基础, 因此不同于InnoDB的日志文件. 如果MySQL用于很重要的系统, 需要事务支持, 并且要支持联机备份, 要保证没有数据丢失, 目前来说, 一般会用InnoDB存贮引挚, 并启用binlog, 为了保证事务的数据不丢失, 就得: 1, 在每次Commit时, 将修改写入InnoDB的日志文件 2, 在每次Commit时, 将修改写入binlog文件 而在Oracle中只是保证写入到Oracle的联机日志就够了, 因此在性能测试中, 如果启用了binlog, 性能基本上下降了一半, 因为这中间要做两次写操作....
学习MySQL, 需要大家帮一点忙之一
开始学习MySQL已经有一周多时间了, 在学习的过程中, 没有一个有一定负荷的数据库在面前, 是很抽象的, 比如我最近正在研究的MySQL中的状态变量(Status Variables), 就需要从真实的库中去取一些数据出来, 以加深一下这些状态变量的印象. 为此我写了一小段Perl的代码(下载), 用来每隔十秒种输出一些我认为比较重要的状态变量的变化值, 不知道有谁能帮我去运行一下这个角本, 返回一二百行记录给我? 我在这儿先说声谢谢了. 这个小工具中只是十秒钟执行一下"SHOW GLOBAL STATUS"命令, 除此之外不运行任何SQL语句, 因此不会引起什么问题, 可以放心大胆地运行. 现在输出的结构是直接打印到屏幕的, 你可以将输出重定向到一个文件, 要退出程序的运行, 请按Control+C或者向程序发送一个INT信号(kill -INT pid). 程序以MySQL的root用户本地连接, 在程序中没有指定口令, 因为我假定root用户只能本地登录, 并且不需要密码. 对于这个程序, 我还会改进的, 如果觉得有用,...
MySQL中我认为比重要的一些Status变量
1, Bytes_sent 累计值, 向客户端发送的字节数 2, Binlog_cache_disk_use 当前值, Binlog中(因为Binlog_cache_size不够大)用了临时文件的事务数, 如果不用Binlog则没有什么事情. 3, Connections 累计值, 向MySQL发出连接的数量, 成功和失败的总数. 4, Created_tmp_disk_tables 累计值?, MySQL中创建的在磁盘上的临时表的总数. 5, Flush_commands 累计值, Flush命令执行的次数 6, Handler_commit 累计值, 处理Commit的次数 7, Handler_rollback...
V$SYSSTAT, V$MYSTAT及V$SESSION
在Oracle中我们有上面三个视图, 在进行性能调整时可以提供很有用的信息, 发挥了比较大的作用. 本站的小工具OTop就是建立在V$SYSSTAT和V$SESSTAT的基础上的. 在MySQL中也存在类似的命令: 1, V$SYSSTAT 对应的命令为SHOW GLOBAL STATUS, 输出两列, 第一列为Statistics名称, 第二列为Statistics的值, 我现在玩的是5.0.37版本, 总共有248个统计值. 对这些统计值的简单介绍在手册或官方网站上可以找到, 我现在还没有仔细地阅读. 在MySQL中这些SHOW命令也是SQL, 和Oracle中的SELECT一样返回一个结果集, 并不一定得写SELECT语句来查系统表. 2, V$MYSTAT 对应的命令为SHOW SESSION STATUS, 输出结果和前面相同. 我没有找到什么命令来输出象Oracle中V$SESSTAT那样的结果, 来查询另外一个会话的统计信息. 3, V$SESSION 对应的命令为SHOW PROCESSLIST,...
MySQL中的RBO特性, 数据访问方法的排名
参考原始文档后, 自已总结一下, 有不对的地方请指正. 在数据库中对数据的访问总存在不同的方法, MySQL中比较常的有以下几种, 在这儿按从好到坏的顺序排列. 在Oracle的Concept文档中, Oracle RBO有十六种不同的访问方法, MySQL中主要有以8种: 1, 访问系统固定(Constant)表 -- system. 2, 访问用户的固定表 -- const. 3, 在主键或维一性索引上用等于查找 -- eq_ref. 4, 在非空列的索引上用等于查找 -- ref. 5, 在允许空值的索引上用等于查找 -- ref_or_null. 6, 在索引上按范转查找 -- range. 7, 扫描整个索引 -- index....
MySQL数据库如何进行排序(Sort)操作?
参考原始文档后, 自已总结一下, 有不对的地方请指正. 在MySQL中进行排序有两种算法, 以4.1版本为分水岭, 在此之前排序时的数据只包括ORDER BY中的列和一个记录的指针(Sort A), 在4.1之后多了一种改进的方法, 排序的数据中可以包括SELECT中的列和ORDER BY中的列(Sort B) Sort A中最主要的坏处是需要进行二次扫表, 第一次是将ORDER BY的列及记录指针读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成, 则可能会用到临时表(tmpdir)空间. 排完序后再根据记录指针将记录读取到READ RND Buffer中, 这一步可能会很慢, 因为这里进行的读取大都是随机读, 而不是顺序读. Sort B中在第一次扫描表时将SELECT中的列和ORDER BY的列读到SORT Buffer中, 然后排序, 如果要排序的数据很多, 不能在内存中完成,...
MySQL每个Session所需要的内存情况
1, PGA 在Oracle中每个会话都会有PGA, MySQL中的会话也是如此. 主要包括三部份: (a), 堆栈区, 由THREAD_STACK变量来决定; (b), 接收缓冲(Receive Buffer/Connection Buffer), 由NET_BUFFER_LENGTH参数决定; (c), 发送缓冲(Send Buffer/Result Buffer), 同接收缓冲区同样大小. 当在执行SQL语时, 会将SQL语句的文本复制一份, 如果你的SQL写得很长, 这部份也不可以小看的哦! 当进程或线程不再需要时, 则这些内存区域会释放. 2, IO Buffer IO读取缓冲, 顺序读时由参数READ_BUFFER_SIZE控制大小, 而随机读时由READ_RND_BUFFER_SIZE参数来决定, 在InnoDB下据说是没用的, 因为InnoDB本身就缓冲机制, 但是在读取临时文件时是否有效呢? 象Oracle中有专门的SORT_MULTIBLOCK_READ_COUNT参数. 3, Sort...
InnoDB存贮引挚的一些重要设置选项
1, innodb_buffer_pool_size 用于缓冲表及其索引的内存区大小, 象Oracle中的DB_CACHE_SIZE, 这个比较容易理解. 2, innodb_log_file_size 每个日志文件的大小, Oracle在这个默认值上, 不同的版本变化很多. 真实的应用中, 从20M到2G都有人用, 自已选吧. 我现在并没有看到什么Checkpoint的概念, 不知道大小对于MySQL有多大的影响? 3, innodb_log_buffer_size 相当于Oracle中的LOG_BUFFER参数, 不过MySQL每秒种都会将日志缓冲区的内容写入日志文件, 因此不用设多大. 4, innodb_flush_logs_at_trx_commit 这个参数用于控制在用户发出提交(Commit命令)时, MySQL如何处理日志缓冲中的内容. 在默认情况下, MySQL会每秒种将日志文件强行刷新到磁盘, 由于日志文件还受操作系统文件缓冲的控制, 因此在写时就可以分为两步了, 第一步是写入日志文件, 写到文件缓冲就算成功, 第二步将日志文件刷到磁盘, 真正写入磁盘....
从手工创建MySQL数据库开始学习
当初学习Oracle时, 曾花了很多时间翻来复去地练这一招, 现在学习MySQL我仍从这儿开始. 在虚拟机(VMWare)上装了一个Redhat AS 4 U1, 到MySQL网站上下载了rpm版本的安装文件(包括客户端和服务器), 版本是: [root@RH4SRV1 MysqlDB]# rpm -qa | grep MySQL MySQL-client-community-5.0.37-0.rhel4 MySQL-server-community-5.0.37-0.rhel4 安装过程就不说了, 主要来练习一下手工建库的过程, 这样安装后, 是没有数据库的, 相应于Oracle安装时选择了不创建数据库这一选项. 首先要准备一下数据文件的目录, 并将这些目录的所有者都改为mysql:mysql, 我使用的目录结构如下: /MysqlDB/data /MysqlDB/InnoDB /MysqlDB/InnoDB/log 然后连接到mysql用户, 创建一个参数文件/MysqlDB/my.ini, 包括如下几个参数: [mysqld] port =...
将要学习MySQL, 请推荐有关图书!
最近要学学MySQL了. 从最小处来讲, 这个Blog也是用MySQL的. 从大处讲, MySQL可以免费使用, 你不需要为此支付许可证的费用(至少目前如此). 只要你有足够的信心和实力, 完全可以将部分数据存放在MySQL中, 以降底公司的营运成本. 学习MySQL是可以省钱地!. 我们之中很多人都学过或用过MySQL, 因此想请大家推荐一下MySQL方面的精品图书. 至于我理想中的书是怎么样的呢? 应当象我最推崇的Oracle Concept那样的, 可以称之为MySQL Concept, 能够讲解一下MySQL最重要的一些概念, 进程, 内存, 结构等方面的的, 希望从这些资料中了解MySQL的一些构架. 至于目前的MySQL水平, 只了解一些概念, 关于MySQL的进程, 内存及架构方面一点都不清楚. 初步地看了一下和内存有关的参数, 很晕! 有Myisam有关的内存参数, 有ndb有关的参数, 还有InnoDB有关的参数, 还有在MySQL中是如何处理SQL的? 还有处理join和sort的一些内存参数, 实在是比较难以理解....
使refresh_mysql适用于数据归档的一点改进
受上一篇中案例的启发, 对refresh_mysql角本作了一点点改进, 可以为DELETE目标数据库的SQL加一个WHERE条件, 以防止删除不想删除的数据. 举个简单的例子来说, 有一个产品数据和历史库, 产品库中只有今年的记录, 而历史库中包括所有(当前的和07年以前)的数据, 我们还需要将产品库的修改比较实时地反应到历史库中, 那么我有可能要经常在产品库中删除三个月以前的记录, 为了不让这些删除操作被复制到历史库中, 就可以加一个Where条件了, 如"CREATE_DATE > SYSDATE - 30", 这样的话, 就只能在历史库中更新最近三个月的记录了: 只需要refresh_mysql角本的配置文件后面再加一列, 如下所示: # SOURCE # PKEY # MVIEW Log # TARGET T_OBJECTS # OBJECT_ID # MLOG$_T_OBJECTS # T_OBJECGS #...
由物化视图Complete刷新引起的数据丢失
今日早上, 在网上看到一篇贴子, 问了如下两个问题: 数据仓库中有2007年之前的数据 问题一: 如何保持erp与数据仓库中2007年数据一致而数据仓库中2007年之前数据不变(以前通过dbms_mview.refresh('xxx','fast'))? 问题二: 我对x物化视图做了一个全部刷新,但是x物化视图中的数据全部变成2007年的数据,以前数据丢失?如阿恢复到刷新前的状态 其中第一个问题是个难题, 现在很多公司都在想这样的一个解决方案, 其实就是一个实时复制方案, 从在的角度来说, 这方面可以用的方案有: 1, Quest公司的SharePlex; 2, DSG公司的RealSync(没有一点印象); 3, Oracle公司的Stream. 前两者都是比较贵的解决方案, Oracle的Stream懂的人少, 而且在9i中还不够稳定. 物化视图并不适合用来归档生产库的数据到历史库, 原来就象第二点所说的那样, 如果进行全部刷新, Oracle会先在目标数据库上运行一个DELETE命令来删除所有的数据(你可以SQL_TRACE一把), 估计这位老兄也是查了资料或翻了贴子后, 觉得物化视图可以做到这一点, 所以这样做了一把, 结果就是数据被删除了. 最近我也一直在想这样的一个解决的方法, 在物化视图中, 用物化视图日志来捕获对表的变更, 是一个比较好的方法(对于负荷不是很高的数据库),...
在MySQL中建立实体化视图日志
在MySQL中建立实体化视图日志表, 在这里基表表名是T_MVLOG, 主键字段是COL1. 日志表结构如下: CREATE TABLE MLOG$_T_MVLOG ( SEQUENCE$$ BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, DMLTYPE$$ CHAR, COL1 BIGINT ); Oracle中的实体化视图是用触发器来实现的, 不同的是早期版本是用Internal Trigger(但还可以在Trigger$表中查到), 而在8i及以后的版本中, 则变为Kernel Level Trigger(在Trigger$中是找不到了). 我们现在在MySQL中手工建立触发器, 说不定以后MySQL真的也引入实体化视图功能呢? 也在Kernel级别来实现呢? 发现建立触发器的语句好象Oracle的PL/SQL. DELIMITER |...
角本语言转型, 安装Windows上的Perl环境
1, 安装Windows上的ActivePerl软件. 在下载后, 点击install.bat角本, 然后按照提示打Yes或No, 下面是将软件安装到c:\usr目录(因为Perl角本的第一行一般是/usr/bin/perl -w)下的例子: Did you read the LICENSE.txt file? [no] yes Do you agree to the ActivePerl Community License v2.1? [no] yes Enter top level directory for install? [C:\Perl] c:\usr Create shortcuts to the...
如何在不同类型的数据库间迁移数据?
refresh_mysql.pl是一个用来从Oracle向MySQL中复制变更数据的Perl角本. 通过变通的方法, 也可以用于在不同种类的数据库之间拷贝数据. 只要我们建一个假的和Oracle实体化视图日志表结构差不多的表就可以了, 然后向这个表中手工插入记录(在Oracle中, 实体化视图日志会被自动维护), 也可以被这个角本支持. 再进一步地去设想, 在非Oracle的数据库中, 可以用触发器(Trigger)来维护变更记录, 达到和视图化视图日志一样的作用, 就可以从其他的数据库向Oracle复制数据了. 在这儿只要我们自已建的临时表包括所有的主键列, 两个名字分别为"SEQUENCE$$"和"DMLTYPE$$"的列就可以了, 我已经在MySQL中测试过了, 列名中可以包含"$"符号, 如下所示: create table temp_table { SEQUENCE$$ INT NOT NULL PRIMARY KEY, DMLTYPE$$ VARCHAR(1) DEFAULT 'I', pkey_col1 column_type, pkey_col... column_type ); ...
refresh_mysql.pl角本的一个配置例子
在Oracle中创建表和实体化视图日志: CREATE TABLE T_OBJECTS AS SELECT * FROM DBA_OBJECTS WHERE ROWNUM < 1; ALTER TABLE T_OBJECTS MODIFY OBJECT_ID NOT NULL; ALTER TABLE T_OBJECTS ADD PRIMARY KEY (OBJECT_ID); CREATE MATERIALIZED VIEW LOG ON T_OBJECTS WITH PRIMARY KEY, SEQUENCE; ...
写了一个从Oracle复制到MySQL的Perl角本
根据对实体化视图的研究及昨天的设想, 花了大约一个早上的时间, 写了一个从Oracle复制到MySQL的Perl角本, 早上测试时还是比较有趣的. 在现在的角本中, 源表名和目标表名可以不一样, 但字段名必须一样. 做测试时, 先开一个窗口, 运行刷新角本: C:\AnySQL>perl refresh_mysql.pl -s anysql:anysql:test -t mysql:root:mysql:localhost:test -c myrefresh.conf 02/13 12:52:25 - 1 tables will be processed. 02/13 12:53:06 - Start replication from T_MVLOG to T_MVLOG with...
从Oracle向MySQL或其他库的数据复制方法
最近花了几天时间更深入地研究了一上实体化视图(Materialized View), 接下来就要利用研究的所得去练习一下了, 想做什么呢? 利用实体化视图日志(Materialized View Log)来跟踪Oracle数据库中表的变化, 然后写Perl程序去将变化过的数据刷新到MySQL数据库中, 充分防照实体化视图增量刷新(Fast Refresh)的原理, 可以高效地实现这一功能, 足以应对一般的业务需求了. 下面强调最主要的几点: 1, 每一个表必需要有主键. 2, 用With Primary Key, Sequence选项创建实体化视图日志, 以支持增量刷新. 3, 在实化化视图日志上可以建一个CREATE_DATE列, 默认值SYSDATE. 4, 在实化化视图日志上为SEQUENCE$$列创建一个索引. 5, 现在只考虑简单的记录复制. Oracle的增量刷新有些小问题, 当实体化视图日志中有很多的记录时, 刷新过程很容易失败, 因此我在这儿对这个过程作些改进, 根据SEQUENCE$$的值来进行刷新, 每次最多刷新1000条记录, 小批量地做, 可以提高刷新频率....
站内搜索 | Search
总数: 519 | 留言: 1607
- Name: Fangxin Lou
- MSN: anysql©live.com
- Mail:anysql©yahoo.com
anysql©gmail.com - Skype: anysql
- AIM: loufangxin
- Mobile:008615925611590
分类 | Categories
软件下载:
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql