Archive for the ‘mysql’ Category

mysql my.cnf 详解

星期四, 十二月 31st, 2009

Mysql my.ini 配置文件详解 #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大 #TYPE: SYSTEM #END CONFIG INFO # # 此mysql配置文件例子针对4G内存 # 主要使用INNODB #处理复杂队列并且连接数量较少的mysql服务器 # # 将此文件复制到/etc/my.cnf 作为全局设置, # mysql-data-dir/my.cnf 作为服务器指定设置 # (@localstatedir@ for this installation) 或者放入 # ~/.my.cnf 作为用户设置. # # 在此配置文件中, 你可以使用所有程序支持的长选项. # 如果想获悉程序支持的所有选项 # 请在程序后加上"–help"参数运行程序. # # 关于独立选项更多的细节信息可以在手册内找到 # # # 以下选项会被MySQL客户端应用读取. [...]

Xtrabackup备份和恢复MySQL

星期二, 十一月 24th, 2009

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。Xtrabackup中包含两个工具: * xtrabackup – 用于热备份innodb, xtradb表的工具,不能备份其他表。 * innobackupex – 对xtrabackup封装的perl脚本,提供了myisam表备份的能力。 Xtrabackup可以做什么 * 在线(热)备份整个库的InnoDB, XtraDB表 * 在xtrabackup的上一次整库备份基础上做增量备份(innodb only) * 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) Xtrabackup如何工作的 * xtrabackup – 具体原理有待研究。。。 * innobackupex整库备份 1. 调用xtrabackup对innodb表空间文件(这一瞬间的映像Time1)备份,而在这个innodb表备份期间数据库是不加锁的,外部可以继续往库里增减数据(这才能叫热备份)。而在Time1和Time2这两个时间点之间的改动由一个线程不断地扫innodb log获得(ChangeSet1)。 2. 锁所有库。 3. 以直接拷贝的方式备份frm,MYD,MYI,MRG,TRG,TRN,opt格式的文件。 4. 步骤3中的数据备份完毕时(Time2),停止扫innodb log的线程,把ChangeSet1的数据拷贝到备份中。 5. 解锁所有库。 6. 终止挂起,备份完毕。 注意要点 * 根据innobackupex的原理可知它不是真正的热备份,MyISAM表越少越小就越有利。要利用Xtrabackup的好处就尽量用innodb表。 * 还原备份前关闭mysql服务;还原备份后检查数据文件权限是否正确。 * 性能:备份一个数据目录总大小5.6G,其中ibdata 2G,总时间4分钟,锁表时间2.5分钟。如果用mysqldump做这个库的备份锁表时间是5-8倍。 安装 tar zxf xtrabackup-0.7.tar.gz cd xtrabackup-0.7 [...]

mydns-ng mydns 的后继版

星期三, 九月 30th, 2009

无意间在 ports 看到 mydns-ng MyDNS-ng is a free DNS server for UNIX. It was implemented from scratch and is designed to serve records directly from an SQL database (currently either MySQL or PostgreSQL). MyDNS-ng is based on MyDNS originaly writen by Don Moore bboy@bboy.net Oficial Site http://mydns.bboy.net. MyDNS is licensed under the GNU General Public [...]

加快innodb 关闭

星期五, 七月 3rd, 2009

mysql> set global innodb_max_dirty_pages_pct = 0; 过半小时再shutdown就快了

MySQL内存使用分析-全局共享[转]

星期五, 五月 15th, 2009

全局共享内则主要是 MySQLInstance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的 QueryCache,缓存连接线程的 Thread Cache,缓存表文件句柄信息的 Table Cache,缓存二进制日志的 BinLogBuffer, 缓存 MyISAM 存储引擎索引键的 Key Buffer以及存储 InnoDB 数据和索引的 InnoDB BufferPool 等等。下面针对 MySQL 主要的共享内存进行一个简单的分析。 查询缓存(Query Cache):查询缓存是 MySQL 比较独特的一个缓存区域,用来缓存特定Query 的结果集(Result Set)信息,且共享给所有客户端。通过对 Query 语句进行特定的 Hash 计算之后与结果集对应存放在Query Cache 中,以提高完全相同的 Query 语句的相应速度。当我们打开 MySQL 的 Query Cache 之后,MySQL接收到每一个 SELECT 类型的 Query 之后都会首先通过固定的 Hash 算法得到该 Query 的 Hash 值,然后到 QueryCache 中查找是否有对应的 Query Cache。如果有,则直接将 Cache的结果集返回给客户端。如果没有,再进行后续操作,得到对应的结果集之后将该结果集缓存到 Query [...]

MySQL内存使用分析-线程独享[转]

星期五, 五月 15th, 2009

  对于任何一个数据库管理系统来说,内存的分配使用绝对可以算的上是其核心之一了,所以很多希望更为深入了解某数据库管理系统的人,都会希望一窥究竟,我也不例外。 从内存的使用方式MySQL 数据库的内存使用主要分为以下两类 线程独享内存 全局共享内存 今天这篇文章暂时先分析 MySQL 中主要的 “线程独享内存” 的。 在 MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量。 线程栈信息使用内存(thread_stack):主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。 排序使用内存(sort_buffer_size):MySQL用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL会将数据写入磁盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以sort_buffer_size参数对排序操作的性能影响绝对不可小视。排序操作的实现原理请参考:MySQL Order By 的实现分析。 Join操作使用内存(join_buffer_size):应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/indexjoin),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作(具体Join 实现算法请参考:MySQL 中的 Join 基本实现原理)。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join的表进行 Join 操作,然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。 顺序读取数据缓冲区使用内存(read_buffer_size):这部分内存主要用于当需要顺序读取数据的时候,如无发使用索引的情况下的全表扫描,全索引扫描等。在这种时候,MySQL按照数据的存储顺序依次读取数据块,每次读取的数据快首先会暂存在read_buffer_size中,当 buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。 随机读取数据缓冲区使用内存(read_rnd_buffer_size):和顺序读取相对应,当MySQL进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。总的来说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size参数所设置的内存缓冲区。 连接信息及返回客户端前结果集暂存使用内存(net_buffer_size):这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当 MySQL [...]

[译]Innodb 性能优化基础

星期日, 四月 19th, 2009

Innodb 性能优化基础 原文链接 http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/ 以便于理解,略作删改     问一个基础的问题–如果你有一个16G内存的服务器,专用于mysql大型的Innodb数据库.应该做什么样的设置?   硬件 如果你的Innodb数据库很大,内存是首要的.16-32G现在很便宜了.CPU方面 2个双核的core 就非常好了.但是这跟应用也有很大的关系.第三是IO系统-DAS和RAID是很好的选择.一般来说6-8块硬盘就够了,有时可能需要更多.而且新的2.5″的SAS硬盘,小却速度快.RAID10对于数据存储和主要是读的场合下十分好.需要冗余性的话RAID5也不错但注意对于RAID5的随机写操作.   操作系统 首先 运行64位的操作系统.现在还有很多32位的系统带着很大的内存运行着.建议不要这么做.如果系统是linux,对数据库的目录使用LVM可以获得更高效的备份.ext3文件系统大部分情况下都不会出问题,如果碰到问题的话,试试XFS.如果你使用innodb_file_per_table而且表很多的话可以使用noatime和nodiratime选项,但是这样做效果不是很大.Also make sure you wrestle OS so it would not swap out MySQL out of memory. (最后这句话不知道该如何翻译)   MYSQL 的Innodb 设置 最重要的地方有: innodb_buffer_pool_size 设为内存的70%-80%都是安全的.我在一个16G的机器上把它设成12G. UPDATE 关于它具体的查看http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/ innodb_log_file_size 这取决于你需要的回复速度.256M这个数值是适当的恢复时间和良好性能之间的一个好的平衡. innodb_log_buffer_size=4M 大多数情况4M足够,除非正将很大的blob数据导入到Innodb中可以增加一点. innodb_flush_log_at_trx_commit=2 如果你不是很关心ACID,可以容许在系统完全crash的情况下丢失最后一两秒的事务,那么可以设置这个值.它可以极大的提高“短“的写事务的效率. innodb_thread_concurrency=8 这个值取决于你的程序,可能高或者低.8是代表起始值. innodb_flush_method=O_DIRECT 避免双缓冲(double buffering)和降低swap的压力.大多数情况下可以提高性能.但是注意如果你RAID cache不够的话,写IO的操作会有麻烦. innodb_file_per_table [...]

[翻译][注解]Innodb Performance Optimization Basics

星期日, 四月 19th, 2009

原文链接地址如下:http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/ 这篇文章写于2007年11月 翻译参考了这篇译稿:http://yahoon.blog.51cto.com/13184/76592 推荐详细阅读原作者的这篇演讲稿 Innodb性能优化基础 面试别人的时候我喜欢问一个基础的问题:如果你有一个16G内存,专用于mysql大型innodb的数据库服务器,对于典型的web负载,你应该怎样调整mysql的设置?有趣的是其中大多数并不能提出任何有益的建议。所以我决定公布答案,并且我很乐意在硬件,操作系统和应用方面谈谈基础的一些优化。 这篇文章的标题是‘Inodb性能优化基础’,所以这里面的是一些普遍的准则,适用于很多的应用场景,当然最佳的设置要依据具体的应用而定。 硬件 如果你的Innodb数据库很大,那么内存是最重要的。现在16-32G的内存性价比就不错。 From CPU standpoint 2*Dual Core CPUs seems to do very well, while with even just two Quad Core CPUs scalability issues can be observed on many workloads. CPU方面,两个双核的CPU,似乎就不错了,而即使只有两个四核心CPU的可扩展性问题都可以观察到很多的工作量,但是这跟应用也有很大的关系。(这里翻译的很别扭,大家看原文) 第三是IO系统--DAS和RAID是很好的选择.一般来说6-8块硬盘就够了,有时可能需要更多。同时注意新的2.5″的SAS硬盘,小却速度快。RAID10对于数据存储和主要是读的场合下十分合适。需要冗余性的话RAID5也不错,但注意对于RAID5的随机写操作。 操作系统 首先--运行64位的操作系统。现在不少有大内存的服务器,上面还跑着32位的操作系统。建议不要这么做。 如果系统是linux,对数据库的目录使用LVM可以获得更高效的备份。 ext3文件系统大部分情况下都不会出问题,如果碰到问题的话,试试XFS。 如果你使用innodb_file_per_table而且表很多的话可以使用noatime和nodiratime选项,但是这样做效果不是很大。 同时注意给系统留出足够的内存,防止mysql和系统发生内存竞争导致被交换出内存。 MYSQL 的Innodb 设置 (关于更多更详细的参数说明,请参考这里(中文文档)) 最重要的地方有: innodb_buffer_pool_size 设为内存的70%-80%都是安全的。我在一个16G的服务器上把它设成12G。 UPDATE: 如果你想了解更多的细节,请查看tuning innodb buffer [...]

什么时候该增加MySQL数据库的内存?

星期日, 四月 19th, 2009

除了优化好数据库配置文件外,更换/增加MySQL数据库服务器的硬件,是提高数据库性能最直接有效的方法。 这里先从最便宜的内存入手。(服务器内存和硬盘价格一般是台式机的5倍左右) 最便捷的方法是使用mysqlreport,来持续关注报告里面‘Key’和‘InnoDB Buffer Pool’这两个部分。如果你的my.cnf参数设置正确,但是Read hit一直低于99%,那么就要考虑增加内存了。 那么Read hit是怎么计算出来的呢?为什么要持续关注?在MySQL的命令行下: mysql> show status like ‘key_read%’; +——————-+————+ | Variable_name | Value | +——————-+————+ | Key_read_requests | 3041374401 | | Key_reads | 60959876 | +——————-+————+ 2 rows in set (0.02 sec) key_efficiency(Read hit) = 1 – (Key_reads / Key_read_requests) = 97.995647100207184% mysql> show status like ‘Innodb_buffer_pool_read%’; +———————————–+————+ | Variable_name [...]

mysql中InnoDB的强制恢复

星期六, 四月 18th, 2009

如果数据库页被破坏,你可能想要用SELECT INTO OUTFILE从从数据库转储你的表,通常以这种方法获取的大多数数据是完好的。即使这样,损坏可能导致SELECT * FROM tbl_name或者InnoDB后台操作崩溃或断言,或者甚至使得InnoDB前滚恢复崩溃。 尽管如此,你可以用它来强制InnoDB存储引擎启动同时阻止后台操作运行,以便你能转储你的表。例如:你可以在重启服务器之前,在选项文件的[mysqld]节添加如下的行: [mysqld]innodb_force_recovery = 4innodb_force_recovery被允许的非零值如下。一个更大的数字包含所有更小数字的预防措施。如果你能够用一个多数是4的选项值来转储你的表,那么你是比较安全的,只有一些在损坏的单独页面上的数据会丢失。一个为6的值更夸张,因为数据库页被留在一个陈旧的状态,这个状态反过来可以引发对B树和其它数据库结构的更多破坏。 · 1 (SRV_FORCE_IGNORE_CORRUPT) 即使服务器检测到一个损坏的页,也让服务器运行着;试着让SELECT * FROM tbl_name 跳过损坏的索引记录和页,这样有助于转储表。 · 2 (SRV_FORCE_NO_BACKGROUND) 阻止主线程运行,如果崩溃可能在净化操作过程中发生,这将阻止它。 · 3 (SRV_FORCE_NO_TRX_UNDO) 恢复后不运行事务回滚。 · 4 (SRV_FORCE_NO_IBUF_MERGE) 也阻止插入缓冲合并操作。如果你可能会导致一个崩溃。最好不要做这些操作,不要计算表统计表。 · 5 (SRV_FORCE_NO_UNDO_LOG_SCAN) 启动数据库之时不查看未完成日志:InnoDB把未完成的事务视为已提交的。 · 6 (SRV_FORCE_NO_LOG_REDO) 不要在恢复连接中做日志前滚。 数据库不能另外地带着这些选项中被允许的选项来使用。作为一个安全措施,当innodb_force_recovery被设置为大于0的值时,InnoDB阻止用户执行INSERT, UPDATE或DELETE操作. 即使强制恢复被使用,你也可以DROP或CREATE表。如果你知道一个给定的表正在导致回滚崩溃,你可以移除它。你也可以用这个来停止由失败的大宗导入或失败的ALTER TABLE导致的失控回滚。你可以杀掉mysqld进程,然后设置innodb_force_recovery为3,使得数据库被挂起而不需要回滚,然后舍弃导致失控回滚的表。 本文地址:http://www.bhcode.net/article/20090227/4256.html

只有一个ibd文件如何恢复数据表

星期六, 四月 18th, 2009

  如果目前只有一个ibd的文件,那么我们该怎么恢复整个数据库?原文的作者给出了两种恢复的方法。这两种方法的前提有两个: 1、一是知道所有需要恢复表的创建语句 2、需要一个16进制的编辑器,修改表id 具体的内容请看原文: Sometime you may need to recover a table when all you have is the .ibd file. In this case, if you try to load it into a new instance, your likely to encounter some errors about the table id not matching. And there is not really a way around this. [...]

优化MySQL数据库性能的八种方法

星期二, 三月 31st, 2009

1、选取最适用的字段属性   MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间, 甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是 BIGIN来定义整型字段。   另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。   对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数 值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries)   MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查 询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给 主查询,如下所示:   DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )   使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下, 子查询可以被更有效率的连接(JOIN).. 替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:   SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )   如果使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将 会更好,查询如下:   SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID [...]

[原创] MySQL Proxy 学习笔记

星期一, 三月 30th, 2009

作者:heiyeluren 时间:2008-1-28 博客:http://blog.csdn.net/heiyeshuwu   【 测试平台 】 服务器端: OS:FreeBSD 6.2 Lua: 5.1.1 MySQL Server:4.1.22-log MySQL Proxy: 0.6.0 客户端: OS:Windows XP Pro SP2 PHP: PHP 5.2.4 (cli) MySQL Client: Ver 14.13 Distrib 5.1.19-beta for Win32 注意:本文使用的是最新版本 MySQL Proxy alpha 0.6.0 ,如果是0.5.0版本可能部分选项和操作不一致,同样的,以后如果除了新版本,请参照新版本文档。 【 MySQL Proxy 安装 】 $ fetch http://mirror.mysql-partners-jp.biz/Downloads/MySQL-Proxy/mysql-proxy-0.6.0-freebsd6-x86.tar.gz $ tar zxvf mysql-proxy-0.6.0-freebsd6-x86.tar.gz $ cd mysql-proxy-0.6.0-freebsd6-x86 $ cp sbin/mysql-proxy /usr/local/sbin/ 如果无法正常使用,请检查相应的其他组件是否安装了,mysql-proxy 需要依赖 lua、libtool、glib、libevent 等库。 【 初步使用 [...]

Mysql安装&同步

星期日, 三月 29th, 2009

装mysql压缩文件格式的MySQL二进制分发版 一.   安装的软件: 1.  Red Hat Enterprise Linux 4.0 update5 2.  mysql-5.0.45-linux-i686-icc-glibc23.tar.gz 二、装步骤如下: 首先检查是否安装了Red Hat Enterprise Linux 4.0中自带的mysql服务,检查系统是否安装了mysql软件包,在终端执行如下命令: Shell> rpm –aq | grep mysql –ri 显示如下: mysql-4.1.12-3.RHEL4.1 Mod_auth_mysql-2.6.1-2.2   等软件包 在安装mysql二进制分发版之前请先卸载mysql  rpm软件包   Shell> rpm -e mysql-4.1.12-3.RHEL4.1 将相关的rpm包逐一掉。   shell> groupadd mysql shell> useradd -g mysql mysql    为mysql增加一个登录用户和组 shell> cd /usr/local shell> tar –zxvf mysql-5.0.45-linux-i686-icc-glibc23.tar.gz shell> [...]

my.cnf 注释

星期日, 三月 29th, 2009

从 hi!admin 抄来的一份配置.注释得非常好.精 #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大 #TYPE: SYSTEM #END CONFIG INFO # # 此mysql配置文件例子针对4G内存 # 主要使用INNODB #处理复杂队列并且连接数量较少的mysql服务器 # # 将此文件复制到/etc/my.cnf 作为全局设置, # mysql-data-dir/my.cnf 作为服务器指定设置 # (@localstatedir@ for this installation) 或者放入 # ~/.my.cnf 作为用户设置. # # 在此配置文件中, 你可以使用所有程序支持的长选项. # 如果想获悉程序支持的所有选项 # 请在程序后加上”–help”参数运行程序. # # 关于独立选项更多的细节信息可以在手册内找到 # # # 以下选项会被MySQL客户端应用读取. [...]