本文目录一览:
- 1、如何处理mysql中表损坏问题
- 2、mysql 数据库表间关系图怎么查看?
- 3、讲解MySQL数据库表如何修复
- 4、数据库(mysql)关键知识
- 5、如何对MySQL数据库日志文件进行维护
- 6、MySQL数据库表被锁、解锁,删除事务
如何处理mysql中表损坏问题
5.9.4. 表维护和崩溃恢复
后面几节讨论如何使用myisamchk来检查或维护MyISAM表(对应.MYI和.MYD文件的表)。
你可以使用myisamchk实用程序来获得有关你的数据库表的信息或检查、修复、优化他们。下列小节描述如何调用myisamchk(包括它的选项的描述),如何建立表的维护计划,以及如何使用myisamchk执行各种功能。
尽管用myisamchk修复表很安全,在修复(或任何可以大量更改表的维护操作)之前先进行备份也是很好的习惯
影响索引的myisamchk操作会使ULLTEXT索引用full-text参数重建,不再与MySQL服务器使用的值兼容。要想避免,请阅读5.9.5.1节,“用于myisamchk的一般选项”的说明。
在许多情况下,你会发现使用SQL语句实现MyISAM表的维护比执行myisamchk操作要容易地多:
· 要想检查或维护MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想优化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
可以直接这些语句,或使用mysqlcheck客户端程序,可以提供命令行接口。
这些语句比myisamchk有利的地方是服务器可以做任何工作。使用myisamchk,你必须确保服务器在同一时间不使用表。否则,myisamchk和服务器之间会出现不期望的相互干涉。
5.9.5. myisamchk:MyISAM表维护实用工具
5.9.5.1. 用于myisamchk的一般选项
5.9.5.2. 用于myisamchk的检查选项
5.9.5.3. myisamchk的修复选项
5.9.5.4. 用于myisamchk的其它选项
5.9.5.5. myisamchk内存使用
5.9.5.6. 将myisamchk用于崩溃恢复
5.9.5.7. 如何检查MyISAM表的错误
5.9.5.8. 如何修复表
5.9.5.9. 表优化
可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
调用myisamchk的方法:
shell myisamchk [options] tbl_name ...
options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk --help得到选项列表。
tbl_name是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为myisamchk不知道你的数据库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操作。
如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:
shell myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有MyISAM表的方式是:
shell myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:
shell myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。
当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:
warning: clients are using or haven't closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。
如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表。
5.9.5.1. 用于myisamchk的一般选项
本节描述的选项可以用于用myisamchk执行的任何类型的表维护操作。本节后面的章节中描述的选项只适合具体操作,例如检查或修复表。
· --help,-?
显示帮助消息并退出。
· --debug=debug_options, -# debug_options
输出调试记录文件。debug_options字符串经常是'd:t:o,filename'。
· --silent,-s
沉默模式。仅当发生错误时写输出。你能使用-s两次(-ss)使myisamchk沉默。
· --verbose,-v
冗长模式。打印更多的信息。这能与-d和-e一起使用。为了更冗长,使用-v多次(-vv, -vvv)!
· --version, -V
显示版本信息并退出。
· --wait, -w
如果表被锁定,不是提示错误终止,而是在继续前等待到表被解锁。请注意如果用--skip-external-locking选项运行mysqld,只能用另一个myisamchk命令锁定表。
还可以通过--var_name=value选项设置下面的变量:
变量
默认值
decode_bits
9
ft_max_word_len
取决于版本
ft_min_word_len
4
ft_stopword_file
内建列表
key_buffer_size
523264
myisam_block_size
1024
read_buffer_size
262136
sort_buffer_size
2097144
sort_key_blocks
16
stats_method
nulls_unequal
write_buffer_size
262136
可以用myisamchk --help检查myisamchk变量及其 默认值:
当用排序键值修复键值时使用sort_buffer_size,使用--recover时这是很普通的情况。
当用--extend-check检查表或通过一行一行地将键值插入表中(如同普通插入)来修改键值时使用Key_buffer_size。在以下情况通过键值缓冲区进行修复:
· 使用--safe-recover。
· 当直接创建键值文件时,需要对键值排序的临时文件有两倍大。通常是当CHAR、VARCHAR、或TEXT列的键值较大的情况,因为排序操作在处理过程中需要保存全部键值。如果你有大量临时空间,可以通过排序强制使用myisamchk来修复,可以使用--sort-recover选项。
通过键值缓冲区的修复占用的硬盘空间比使用排序么少,但是要慢。
如果想要快速修复,将key_buffer_size和sort_buffer_size变量设置到大约可用内存的25%。可以将两个变量设置为较大的值,因为一个时间只使用一个变量。
myisam_block_size是用于索引块的内存大小。
stats_method影响当给定--analyze选项时,如何为索引统计搜集处理NULL值。它如同myisam_stats_method系统变量。详细信息参见5.3.3节,“服务器系统变量”和7.4.7节,“MyISAM索引统计集合”的myisam_stats_method的描述。
ft_min_word_len和ft_max_word_len表示FULLTEXT索引的最小和最大字长。ft_stopword_file为停止字文件的文件名。需要在以下环境中对其进行设置。
如果你使用myisamchk来修改表索引(例如修复或分析),使用最小和最大字长和停止字文件的 默认全文参数值(除非你另外指定)重建FULLTEXT索引。这样会导致查询失败。
出现这些问题是因为只有服务器知道这些参数。它们没有保存在MyISAM索引文件中。如果你修改了服务器中的最小或最大字长或停止字文件,要避免该问题,为用于mysqld的myisamchk指定相同的ft_min_word_len,ft_max_word_len和ft_stopword_file值。例如,如果你将最小字长设置为3,可以这样使用myisamchk来修复表:
shell myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
要想确保myisamchk和服务器使用相同的全文
mysql 数据库表间关系图怎么查看?
mysql数据库表间的关系图可以通过navicat查看:
第一步:下载navicat打开;
第二步:点击navicat界面最右下角标注的按钮即可查看关系图。
最新的MySQL Workbench已经完全包含了数据库建模与设计、数据库SQL开发和数据库管理与维护等功能。
Mysql数据库-----表
sh.qihoo.com 2018-04-07 08:20
1、定义: 表(table)是数据库最基本的组成单元,数据库是用来存储数据的,数据库中有很多表,每一个表都是一个独立的单元,表也是一个结构化的文件,由行和列组成,行称为数据或记录,列称为字段,字段又包含:字段名称、字段类型、长度、约束。
2、创建表
(1)、语法格式:create table 表名称(字段名 类型(长度) 约束);
(2)、MySQL常用数据类型
VARCHAR:可变长度字符串(VARCH AR(3)表示存储的数据长度丌能超过3个字符长度)
CHAR:定长字符串(CHAR(3) 表示存储的数据长度丌能超过3个字符长度)
INT:整数型(INT(3)表示最大可以存储999)
BIGINT:长整型(对应java程序中的long类型)
FLOAT:浮点型单精度(FLOAT(7,2)表示7个有效数字,2个有效小数位)
DOUBLE:浮点型双精度(DOUBLE(7,2)表示7个有效数字,2个有效小数位)
DATE:日期类型( 实际开发中,常用字符串代替日期类型)
BLOB:二进制大对象 Binary Large Object(专门存储图片、视频、声音等数据)
CLOB:字符型大对象 Character Large Object( 可存储超大文本,可存储4G+字符串)
VARCHAR与CHAR对比:
都是字符串
VARCHAR比较智能,可以根据实际的数据长度分配空间,比较节省空间;但在分配的时候需要相关判断,效率低。
CHAR不需要劢态分配空间,所以执行效率高,但是可能会导致空间浪费
若字段中的数据不具备伸缩性,建议采用CHAR类型存储
若字段中的数据具备很强的伸缩性,建议采用VARCHAR类型存储
讲解MySQL数据库表如何修复
一张损坏的表的症状通常是查询意外中断并且你能看到例如这些错误: ◆ “tbl_name.frm”被锁定不能改变。 ◆ 不能找到文件“tbl_name.MYI”(Errcode :### )。 ◆ 从表处理器的得到错误###(此时,错误135是一个例外)。 ◆ 意外的文件结束。 ◆ 记录文件被毁坏。 在这些情况下,你必须修复表。表的修复是一项非常困难的工作,很多情况下令人束手无策。然而,有一些常规的知道思想和过程,可以遵循它们来增加修正表的机会。通常,开始是可以用最快的修复方法,看看能否袖珍故障。如果发现不成功,可以逐步升级到更彻底的但更慢的修复方法。如果仍旧难以修复,就应该从备份中恢复了。在上一章已经详细介绍了这一部分内容。 简单安全的修复 为了修复一个表执行下列步骤: ◆ 首先,用--recover,-r选项修正表,并且用--quick,-q选项,来只根据索引文件的内容进行恢复。这样不接触数据文件来修复索引文件。(-r意味着“恢复模式”) myisamchk -r -q tbl_nameisamchk -r -q tbl_name ◆ 如果问题仍旧存在,则忽略--quick选项,允许修复程序修改数据文件,因为这可能存在问题。下面的命令将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件: myisamchk -r tbl_nameisamchk -r tbl_name ◆ 如果前面的步骤失败,使用。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况(但是更慢)。 myisamchk --safe-recover tbl_nameisamchk --safe-recover tbl_name困难的修理如果在索引文件的第一个16K块被破坏,或包含不正确的信息,或如果索引文件丢失,你只应该到这个阶段 。在这种情况下,创建一个新的索引文件是必要的。按如下这样的步骤做: ◆ 定位到包含崩溃表的数据库目录中 ◆ 把数据文件移更安全的地方。
数据库(mysql)关键知识
Mysql是目前互联网使用最广的关系数据库,关系数据库的本质是将问题分解为多个分类然后通过关系来查询。 一个经典的问题是用户借书,三张表,一个用户,一个书,一个借书的关系表。当需要查询某个用户借书情况或者是书被那些人借了,就用关系查询来实现。
关系数据库范式
来自英文Normal form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。总共有六种范式:第一范式(1NF)、第二范式(2NF)、 第三范式 (3NF)、巴斯-科德范式(BCNF)、 第四范式 (4NF)和 第五范式 (5NF,又称完美范式)。
1NF是指数据库表的每一列都是不可分割的原子数据项。2NF必须满足1NF,要求数据库表中的每行记录必须可以被唯一地区分。3NF在2NF基础上,任何非主 属性 不依赖于其它非主属性(在2NF基础上消除传递依赖)。BCNF是在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖), 满足BCNF不再会有任何由于函数依赖导致的异常,但是我们还可能会遇到由于多值依赖导致的异常。4NF的定义很简单:已经是BC范式,并且不包含多值依赖关系。5NF处理的是无损连接问题,这个范式基本没有实际意义,因为无损连接很少出现,而且难以察觉。而域键范式试图定义一个终极范式,该范式考虑所有的依赖和约束类型,但是实用价值也是最小的,只存在理论研究中。
Catalog和Schema
是数据库对象命名空间中的层次,主要用来解决命名冲突的问题。从概念上说,一个数据库系统包含多个Catalog,每个Catalog又包含多个Schema,而每个Schema又包含多个数据库对象(表、视图、字段等)。但是Mysql的数据库名就是Schema,不支持Catalog。
Mysql的数据库引擎主要有两种MyISAM和InnoDB,MyISAM支持全文检索,InnoDB支持事务。
SQL中的通配符‘%’代表任意字符出现任意次数。‘_’代表任意字符出现一次。SQL与正则表达式结合查询一般用在WHERE table_name REGEXP '^12.34'。子查询是从里到外执行。
数据库联结(join)涉及到外键,外键是指一个表的列是另一个表的主键,那么它就是外键。笛卡尔积联结(不指定联结条件时)生成的记录条目是单纯的第一个表的行乘以第二个表的列数。用得最多的是等值联结也叫内部联结。
高级联结还有自连接,是指查询中的两张表是同一张表,它通常作为外部语句用来代替从相同表中检索数据时使用的子查询。自然联结使每个列只返回一次。外部联结是指联结包含了那些在相关表中没有关联行的行。例如列出所有产品及其订购数量,包括没有人订购的产品。LEFT OUTER JOIN指选择左边表的所有行。
组合查询是指采用UNION等将两个查询结果取并集。
视图是查看存储在别处的数据的一种工具,它本身并不包含数据,因此表的数据修改了,视图返回的数据也将随之修改,因此如果使用了复杂或嵌套视图会对性能有较大的影响。视图的作用之一是隐藏复杂的SQL通常会涉及到联结查询。
存储过程类似于批处理,包含了一条或多条SQL语句。语法:
CREATE PROCEDURE name()
BEGIN
SQL
END
-------------------------
CALL name()//来调用存储过程
游标有DECLARE定义,游标与存储过程是绑定的,存储过程处理完成,游标就会消失。游标被打开后可以使用FETCH语句访问每一行。
触发器是在某个时间发生时自动执行某条SQL语句。语法:
CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW
事务处理可以维护数据库的完整性,保证批量的操作要么完全执行,要么完全不执行。包括事务、回退、提交、保留点几个关键术语。ROLLBACK只能在一个事务处理内使用。他不能回退CREATE和DROP操作。使用COMMIT保证事务提交。复杂的事务处理需要部分提交或回退,因此我们需要使用保留点SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留点越多越好。保留点在事务执行完成后自动释放。
如何对MySQL数据库日志文件进行维护
用下列方法可以强制服务器启用新的更新日志:
◆ mysqladmin flush-logs
你一般需要在命令行提供使用的数据库用户:
mysqladmin –u root –p flush-logs
◆ mysqladmin refresh
你一般需要在命令行提供使用的数据库用户:
mysqladmin –u root –p refresh
如果你正在使用MySQL 3.21或更早的版本,你必须使用mysqladmin refresh。
◆ SQL命令
FLUSH LOGS
◆ 重启服务器
上述方法都具有这样的功能:
关闭并且再打开标准和更新记录文件。如果你指定了一个没有扩展名的更新记录文件,新的更新记录文件的扩展数字将相对先前的文件加1。
mysqlFLUSH LOGS;
如何使用新的常规日志
用上面的方法同样可以强制更新常规日志。
要准备备份常规日志,其步骤可能复杂一些:
$ cd mysql-data-directory$ mv mysql.log mysql.old$ mysqladmin flush-tables
MySQL数据库表被锁、解锁,删除事务
在程序员的职业生涯中,总会遇到数据库表被锁的情况,前些天就又撞见一次。由于业务突发需求,各个部门都在批量操作、导出数据,而数据库又未做读写分离,结果就是:数据库的某张表被锁了!
用户反馈系统部分功能无法使用,紧急排查,定位是数据库表被锁,然后进行紧急处理。这篇文章给大家讲讲遇到类似紧急状况的排查及解决过程,建议点赞收藏,以备不时之需。
用户反馈某功能页面报502错误,于是第一时间看服务是否正常,数据库是否正常。在控制台看到数据库CPU飙升,堆积大量未提交事务,部分事务已经阻塞了很长时间,基本定位是数据库层出现问题了。
查看阻塞事务列表,发现其中有锁表现象,本想利用控制台直接结束掉阻塞的事务,但控制台账号权限有限,于是通过客户端登录对应账号将锁表事务kill掉,才避免了情况恶化。
下面就聊聊,如果当突然面对类似的情况,我们该如何紧急响应?
想象一个场景,当然也是软件工程师职业生涯中会遇到的一种场景:原本运行正常的程序,某一天突然数据库的表被锁了,业务无法正常运转,那么我们该如何快速定位是哪个事务锁了表,如何结束对应的事物?
首先最简单粗暴的方式就是:重启MySQL。对的,网管解决问题的神器——“重启”。至于后果如何,你能不能跑了,要你自己三思而后行了!
重启是可以解决表被锁的问题的,但针对线上业务很显然不太具有可行性。
下面来看看不用跑路的解决方案:
遇到数据库阻塞问题,首先要查询一下表是否在使用。
如果查询结果为空,那么说明表没在使用,说明不是锁表的问题。
如果查询结果不为空,比如出现如下结果:
则说明表(test)正在被使用,此时需要进一步排查。
查看数据库当前的进程,看看是否有慢SQL或被阻塞的线程。
执行命令:
该命令只显示当前用户正在运行的线程,当然,如果是root用户是能看到所有的。
在上述实践中,阿里云控制台之所以能够查看到所有的线程,猜测应该使用的就是root用户,而笔者去kill的时候,无法kill掉,是因为登录的用户非root的数据库账号,无法操作另外一个用户的线程。
如果情况紧急,此步骤可以跳过,主要用来查看核对:
如果情况紧急,此步骤可以跳过,主要用来查看核对:
看事务表INNODB_TRX中是否有正在锁定的事务线程,看看ID是否在show processlist的sleep线程中。如果在,说明这个sleep的线程事务一直没有commit或者rollback,而是卡住了,需要手动kill掉。
搜索的结果中,如果在事务表发现了很多任务,最好都kill掉。
执行kill命令:
对应的线程都执行完kill命令之后,后续事务便可正常处理。
针对紧急情况,通常也会直接操作第一、第二、第六步。
这里再补充一些MySQL锁相关的知识点:数据库锁设计的初衷是处理并发问题,作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。MySQL中表级别的锁有两种:一种是表锁,一种是元数据锁(metadata lock,MDL)。
表锁是在Server层实现的,ALTER TABLE之类的语句会使用表锁,忽略存储引擎的锁机制。表锁通过lock tables… read/write来实现,而对于InnoDB来说,一般会采用行级锁。毕竟锁住整张表影响范围太大了。
另外一个表级锁是MDL(metadata lock),用于并发情况下维护数据的一致性,保证读写的正确性,不需要显式的使用,在访问一张表时会被自动加上。
常见的一种锁表场景就是有事务操作处于:Waiting for table metadata lock状态。
MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。
一旦alter table TableA的操作停滞在Waiting for table metadata lock状态,后续对该表的任何操作(包括读)都无法进行,因为它们也会在Opening tables的阶段进入到Waiting for table metadata lock的锁等待队列。如果核心表出现了锁等待队列,就会造成灾难性的后果。
通过show processlist可以看到表上有正在进行的操作(包括读),此时alter table语句无法获取到metadata 独占锁,会进行等待。
通过show processlist看不到表上有任何操作,但实际上存在有未提交的事务,可以在information_schema.innodb_trx中查看到。在事务没有完成之前,表上的锁不会释放,alter table同样获取不到metadata的独占锁。
处理方法:通过 select * from information_schema.innodb_trxG, 找到未提交事物的sid,然后kill掉,让其回滚。
通过show processlist看不到表上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。很可能是因为在一个显式的事务中,对表进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放。从performance_schema.events_statements_current表中可以查到失败的语句。
处理方法:通过performance_schema.events_statements_current找到其sid,kill 掉该session,也可以kill掉DDL所在的session。
总之,alter table的语句是很危险的(核心是未提交事务或者长事务导致的),在操作之前要确认对要操作的表没有任何进行中的操作、没有未提交事务、也没有显式事务中的报错语句。
如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。
关于MySQL的锁表其实还有很多其他场景,我们在实践的过程中尽量避免锁表情况的发生,当然这需要一定经验的支撑。但更重要的是,如果发现锁表我们要能够快速的响应,快速的解决问题,避免影响正常业务,避免情况进一步恶化。所以,本文中的解决思路大家一定要收藏或记忆一下,做到有备无患,避免突然状况下抓瞎。
本文链接:https://my.lmcjl.com/post/18376.html
4 评论