一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Database

MySQL DATEDIFF() 函数

定义和用法 DATEDIFF() 函数返回两个日期之间的天数。 语法

date1 和 date2 参数是合法的日期或日期/时间表达式。 注释:只有值的日期部分参与计算。 实例 例子 1 使用如下 SELECT 语句:

结果: DiffDate 1 例子 2 使用如下 SELECT 语句:

结果: DiffDate -1   from:http://www.w3school.com.cn/sql/func_datediff_mysql.asp

龙生   08 Sep 2016
View Details

MySql四舍五入

FLOOR(X) 返回不大于X的最大整数值。 mysql> select FLOOR(1.23); -> 1 mysql> select FLOOR(-1.23); -> -2 注意返回值被变换为一个BIGINT! CEILING(X) 返回不小于X的最小整数值。 mysql> select CEILING(1.23); -> 2 mysql> select CEILING(-1.23); -> -1 注意返回值被变换为一个BIGINT! ROUND(X) 返回参数X的四舍五入的一个整数。 mysql> select ROUND(-1.23); -> -1 mysql> select ROUND(-1.58); -> -2 mysql> select ROUND(1.58); -> 2 注意返回值被变换为一个BIGINT! ROUND(X,D) 返回参数X的四舍五入的有D为小数的一个数字。如果D为0,结果将没有小数点或小数部分。 mysql> select ROUND(1.298, 1); -> 1.3 mysql> select ROUND(1.298, 0); -> 1 注意返回值被变换为一个BIGINT! from:http://www.cnblogs.com/youyou/archive/2005/11/07/270783.html

龙生   08 Sep 2016
View Details

Asp.net+Mysql,查询出错:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败

在网上看到的解决方案基本都是说host文件中127.0.0.1 localhost 的对应, 但我查看了host文件,并没有问题,纠结半天,拿查询语句在Mysql Workbench上执行,报了一个错,说是子查询包含多个结果,我去~!这很简单的一个错误asp.net竟然没能准确反馈。 于是在子查询语句后面加limit 1,Ok~ 所以,出现“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”这个错误时,有可能是查询语句有问题,而不是连接有问题。 from:http://blog.csdn.net/idoiknow/article/details/8923553

龙生   07 Sep 2016
View Details

MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程

大数据量备份与还原,始终是个难点。当MYSQL超10G,用mysqldump来导出就比较慢了。在这里推荐xtrabackup,这个工具比mysqldump要快很多。 一、Xtrabackup介绍 1、Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。 Xtrabackup有两个主要的工具:xtrabackup、innobackupex 1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表 2、 innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 2、Xtrabackup可以做什么 : 在线(热)备份整个库的InnoDB、 XtraDB表 在xtrabackup的上一次整库备份基础上做增量备份(innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。 Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下: (1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。 (2)在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。 首 先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文 件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。 因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。 因为innobackupex支持innodb,myisam,所以本文说一下,怎么使用innobackupex。 二,安装xtrabackup 1、下载地址 http://www.percona.com/downloads/XtraBackup/ 2、安装 根据需求,选择不同的版本,我选择的是rpm安装包,如果报以下错误 复制代码代码如下: [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY error: Failed dependencies: perl(Time::HiRes) is needed by percona-xtrabackup-2.2.4-5004.el6.x86_64 解决办法: 复制代码代码如下: [root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安装依赖包 [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm   //重新安装 warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key […]

龙生   30 Aug 2016
View Details

MySQL 数据备份与还原

一、数据备份 1、使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。 mysqldump命令的工作原理很简单。它先查出需要备份的表的结构,再在文本文件中生成一个CREATE语句。然后,将表中的所有记录转换成一条INSERT语句。然后通过这些语句,就能够创建表并插入数据。 1、备份一个数据库 mysqldump基本语法: mysqldump -u username -p dbname table1 table2 …-> BackupName.sql 其中: dbname参数表示数据库的名称; table1和table2参数表示需要备份的表的名称,为空则整个数据库备份; BackupName.sql参数表设计备份文件的名称,文件名前面可以加上一个绝对路径。通常将数据库被分成一个后缀名为sql的文件; 使用root用户备份test数据库下的person表

其生成的脚本如下: 文件的开头会记录MySQL的版本、备份的主机名和数据库名。 文件中以“--”开头的都是SQL语言的注释,以"/*!40101"等形式开头的是与MySQL有关的注释。40101是MySQL数据库的版本号,如果MySQL的版本比1.11高,则/*!40101和*/之间的内容就被当做SQL命令来执行,如果比4.1.1低就会被当做注释。 2、备份多个数据库 语法:

加上了--databases选项,然后后面跟多个数据库

3、备份所有数据库 mysqldump命令备份所有数据库的语法如下:

示例:

2、直接复制整个数据库目录 MySQL有一种非常简单的备份方法,就是将MySQL中的数据库文件直接复制出来。这是最简单,速度最快的方法。 不过在此之前,要先将服务器停止,这样才可以保证在复制期间数据库的数据不会发生变化。如果在复制数据库的过程中还有数据写入,就会造成数据不一致。这种情况在开发环境可以,但是在生产环境中很难允许备份服务器。 注意:这种方法不适用于InnoDB存储引擎的表,而对于MyISAM存储引擎的表很方便。同时,还原时MySQL的版本最好相同。 3、使用mysqlhotcopy工具快速备份 一看名字就知道是热备份。因此,mysqlhotcopy支持不停止MySQL服务器备份。而且,mysqlhotcopy的备份方式比mysqldump快。mysqlhotcopy是一个perl脚本,主要在Linux系统下使用。其使用LOCK TABLES、FLUSH TABLES和cp来进行快速备份。 原理:先将需要备份的数据库加上一个读锁,然后用FLUSH TABLES将内存中的数据写回到硬盘上的数据库,最后,把需要备份的数据库文件复制到目标目录。 命令格式如下:

dbname:数据库名称; backupDir:备份到哪个文件夹下; 常用选项: --help:查看mysqlhotcopy帮助; --allowold:如果备份目录下存在相同的备份文件,将旧的备份文件加上_old; --keepold:如果备份目录下存在相同的备份文件,不删除旧的备份文件,而是将旧的文件更名; --flushlog:本次辈分之后,将对数据库的更新记录到日志中; --noindices:只备份数据文件,不备份索引文件; --user=用户名:用来指定用户名,可以用-u代替; --password=密码:用来指定密码,可以用-p代替。使用-p时,密码与-p之间没有空格; --port=端口号:用来指定访问端口,可以用-P代替; --socket=socket文件:用来指定socket文件,可以用-S代替; mysqlhotcopy并非mysql自带,需要安装Perl的数据库接口包;下载地址为:http://dev.mysql.com/downloads/dbi.html 目前,该工具也仅仅能够备份MyISAM类型的表。 二、数据还原   1、还原使用mysqldump命令备份的数据库的语法如下:   mysql -u root -p [dbname] < backup.sq 示例:

2、还原直接复制目录的备份   通过这种方式还原时,必须保证两个MySQL数据库的版本号是相同的。MyISAM类型的表有效,对于InnoDB类型的表不可用,InnoDB表的表空间不能直接复制。 from:http://www.cnblogs.com/kissdodog/p/4174421.html

龙生   30 Aug 2016
View Details

mysql数据库ibdata1文件瘦身

MYSQL运行2年之后ibdata1文件变的非常巨大,传说ibdata1是InnoDB的产物,而且只会增大不会减少。 上网搜了一下解决方法。大体思路就是备份数据,然后删除数据库再还原数据库。 # 备份数据库: mysqldump -uDBuser -pPassword --quick --force --routines --add-drop-database --all-databases --add-drop-table > /data/bkup/mysqldump.sql # 停止数据库 service mysqld stop # 删除这些大文件 rm /usr/local/mysql/var/ibdata1 rm /usr/local/mysql/var/ib_logfile* # 手动删除除Mysql之外所有数据库文件夹,然后启动数据库 service mysqld start # 还原数据 mysql -uDBuser -pPassword < /data/bkup/mysqldump.sql from:http://blog.sina.com.cn/s/blog_40ce02d7010169zr.html

龙生   30 Aug 2016
View Details

使用 MYSQLBINLOG 来恢复数据

BINLOG就是一个记录SQL语句的过程,和普通的LOG一样。不过只是她是二进制存储,普通的是十进制存储罢了。 1、配置文件里要写的东西: [mysqld] log-bin=mysql-bin(名字可以改成自己的,如果不改名字的话,默认是以主机名字命名) 重新启动MSYQL服务。 二进制文件里面的东西显示的就是执行所有语句的详细记录,当然一些语句不被记录在内,要了解详细的,见手册页。 2、查看自己的BINLOG的名字是什么。 show binlog events; query result(1 records) Log_name Pos Event_type Server_id End_log_pos Info yueliangdao_binglog.000001 4 Format_desc 1 106 Server ver: 5.1.22-rc-community-log, Binlog ver: 4 3、我做了几次操作后,她就记录了下来。 又一次 show binlog events 的结果。 query result(4 records)   Log_name Pos Event_type Server_id End_log_pos Info yueliangdao_binglog.000001 4 Format_desc 1 106 Server ver: 5.1.22-rc-community-log, Binlog ver: 4 yueliangdao_binglog.000001 106 Intvar 1 134 INSERT_ID=1 yueliangdao_binglog.000001 134 Query 1 254 use test; create table a1(id int not null auto_increment primary key, str varchar(1000)) engine=myisam yueliangdao_binglog.000001 254 Query 1 330 use […]

龙生   24 Aug 2016
View Details

SQLSERVER如何查看索引缺失

当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能, 但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事。 好在SQLSERVER提供了两种“自动”功能,给你建议,该怎么调整索引 第一种是使用DMV 第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问 这篇文章主要讲第一种 从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下, 这句话是不是缺少什么索引的支持,如果他认为是,他还会预估,如果有这麽一个索引 他的性能能提高多少   SQLSERVER有几个动态管理视图 sys.dm_db_missing_index_details sys.dm_db_missing_index_groups sys.dm_db_missing_index_group_stats sys.dm_db_missing_index_columns(index_handle)     sys.dm_db_missing_index_details 这个DMV记录了当前数据库下所有的missing index的信息,他针对的是SQLSERVER从启动以来所有运行的语句, 而不是针对某一个查询。DBA可以看看,哪些表格SQLSERVER对他是最有“意见”的 以下是这个DMV的各个字段的解释: 1、index_handle:标识特定的缺失索引。该标识符在服务器中是唯一的。index_handle 是此表的密钥 2、database_id :标识带有缺失索引的表所驻留的数据库 3、object_id :标识索引缺失的表 4、equality_columns:构成相等谓词的列的逗号分隔列表 即哪个字段缺失了索引会在这里列出来(简单来讲就是where 后面的筛选字段), 谓词的形式如下:table.column =constant_value 5、inequality_columns :构成不等谓词的列的逗号分隔列表,例如以下形式的谓词:table.column > constant_value “=”之外的任何比较运算符都表示不相等。 6、included_columns:用于查询的涵盖列的逗号分隔列表(简单来讲就是 select 后面的字段)。 7、statement:索引缺失的表的名称 比如下面这个查询结果 那么应该创建这样的索引

在ProductID上创建索引,SalesOrderID作为包含性列的索引   注意事项: 由 sys.dm_db_missing_index_details 返回的信息会在查询优化器优化查询时更新,因而不是持久化的。 缺失索引信息只保留到重新启动 SQL Server 前。如果数据库管理员要在服务器回收后保留缺失索引信息, 则应定期制作缺失索引信息的备份副本     sys.dm_db_missing_index_columns(index_handle) 返回与缺少索引(不包括空间索引)的数据库表列有关的信息,sys.dm_db_missing_index_columns 是一个动态管理函数 字段解释 index_handle:唯一地标识缺失索引的整数。     sys.dm_db_missing_index_groups   返回有关特定缺失索引组中包含的缺失索引(不包括空间索引)的信息   sys.dm_db_missing_index_group_stats 返回缺失索引组的摘要信息,不包括空间索引 这个视图说白了就是预估有这麽一个索引,他的性能能提高多少 有一个字段比较重要: avg_user_impact: 实现此缺失索引组后,用户查询可能获得的平均百分比收益。该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。 就是说,增加了这个缺失索引,性能可以提高的百分比   下面是MSDN给出的示例,缺失索引组句柄为 2

  示例代码:

[…]

龙生   03 Aug 2016
View Details

SQLSERVER排查CPU占用高的情况

今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库   现象 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用不太高,只占用了30个G CPU占用100% 排查方向   一般排查都是用下面的脚本,一般会用到三个视图sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests

看一下当前的数据库用户连接有多少 然后使用下面语句看一下各项指标是否正常,是否有阻塞,这个语句选取了前10个最耗CPU时间的会话

如果想看具体的SQL语句可以执行下面的SQL语句,记得在SSMS里选择以文本格式显示结果

模拟了一些耗CPU时间的动作   还有查看CPU数和user scheduler数和最大工作线程数,检查worker是否用完也可以排查CPU占用情况

查看机器上的所有schedulers包括user 和system 通过下面语句可以看到worker是否用完,当达到最大线程数的时候就要检查blocking了 对照下面这个表 各种CPU和SQLSERVER版本组合自动配置的最大工作线程数 CPU数                 32位计算机                        64位计算机 <=4                     256                                   512 8                        288                                   576 16                       352                                   704 32                       480                                   960

  如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待 结合[sys].[dm_os_wait_stats]视图,如果当前SQLSERVER里面没有任何等待资源,那么下面的SQL语句不会显示任何结果

比如我当前执行了查询SalesOrderDetail_test表100次,由于表数据非常多,所以SSMS需要把SQLSERVER执行的结果慢慢的取走, 造成了ASYNC_NETWORK_IO等待

  问题源头 经过排查和这几天的观察情况,确定是某些表缺失索引导致,现在在这些表上增加了索引,问题解决

查询CPU占用高的语句

查询缺失索引

定位问题后,新建非聚集索引

CPU占用恢复正常   总结 从多次历史经验来看,如果CPU负载持续很高,但内存和IO都还好的话,这种情况下,首先想到的一定是索引问题,十有八九错不了。 注意文章开头贴出的客户机器负载情况图

龙生   03 Aug 2016
View Details
1 25 26 27 44