mysql命令大全



命令大全 


net start mySql;  
 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;  
 列出数据库:show databases;  
 选择数据库:use databaseName;  
 列出表格:show tables;  
 显示表格列的属性:show columns from tableName;  
 建立数据库:source fileName.txt;  
 匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;  
 增加一个字段:alter table tabelName add column fieldName dateType;  
 增加多个字段:alter table tabelName add column fieldName1 dateType,add columns 
 
 多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到
;  
 增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";  
 每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;  
 查询时间:select now();  
 查询当前用户:select user();  
 查询数据库版本:select version();  
 查询当前使用的数据库:select database();  
   
 1、删除student_course数据库中的students数据表:  
 rm -f student_course/students.*  
   
 2、备份数据库:(将数据库test备份)  
 mysqldump -u root -p test>c:\test.txt  
 备份表格:(备份test数据库下的mytable表格)  
 mysqldump -u root -p test mytable>c:\test.txt  
 将备份数据导入到数据库:(导回test数据库)  
 mysql -u root -p test  
   
 3、创建临时表:(建立临时表zengchao)  
 create temporary table zengchao(name varchar(10));  
   
 4、创建表是先判断表是否存在  
 create table if not exists students(,,);  
   
 5、从已经有的表中复制表的结构  
 create table table2 select * from table1 where 1<>1;  
   
 6、复制表  
 create table table2 select * from table1;  
   
 7、对表重新命名  
 alter table table1 rename as table2;  
   
 8、修改列的类型  
 alter table table1 modify id int unsigned;//修改列id的类型为int unsigned  
 alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为
 
   
 9、创建索引  
 alter table table1 add index ind_id (id);  
 create index ind_id on table1 (id);  
 create unique index ind_id on table1 (id);//建立唯一性索引  
   
 10、删除索引  
 drop index idx_id on table1;  
 alter table table1 drop index ind_id;  
   
 11、联合字符或者多个列(将列id与":"和列name和"="连接)  
 select concat(id,':',name,'=') from students;  
   
 12、limit(选出10到20条)<第一个记录集的编号是0>  
 select * from students order by id limit 9,10;  
   
 13、MySQL不支持的功能  
 事务,视图,外键和引用完整性,存储过程和触发器  
   
   
 14、MySQL会使用索引的操作符号  
 <,<=,>=,>,=,between,in,不带%或者_开头的like  
   
 15、使用索引的缺点  
 1)减慢增删改数据的速度;  
 2)占用磁盘空间;  
 3)增加查询优化器的负担;  
 当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,
  
   
 16、分析索引效率  
 方法:在一般的SQL语句前加上explain;  
 分析结果的含义:  
 1)table:表名;  
 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;  
 3)possible_keys:查询可以利用的索引名;  
 4)key:实际使用的索引;  
 5)key_len:索引中被使用部分的长度(字节);  
 6)ref:显示列名字或者"const"(不明白什么意思);  
 7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;  
 8)extra:MySQL的建议;  
   
 17、使用较短的定长列  
 1)尽可能使用较短的数据类型;  
 2)尽可能使用定长数据类型;  
 a)用char代替varchar,固定长度的数据处理比变长的快些;  
 b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;  
 c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的
每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可
  
 d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占
  
   
 18、使用not null和enum  
 尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,
不需要检查是否存在特例,即null值,从而优化查询;  
 如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下
enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是
  
   
 19、使用optimize table  
 对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查
blob数据类型更为突出,因为
optimize table来整理碎片,保证数据库性能不下降,优
 optimize table可以用于MyISAM和BDB类型的数据表。实际
mysqldump来转存数据表,然后使用转存后的文件并重新建数
  
   
 20、使用procedure analyse()  
 可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加
procedure analyse()就可以了;例如:  
 select * from students procedure analyse();  
 select * from students procedure analyse(16,256);  
 第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节
enum类型,如果没有限制,输出可能会很长;  
   
 21、使用查询缓存  
 1)查询缓存的工作方式:  
 第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存
该数据表的任何缓存
  
 2)配置缓存参数:  
 变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查
 select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查
 query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。  
   
 22、调整硬件  
 1)在机器上装更多的内存;  
 2)增加更快的硬盘以减少I/O等待时间;  
 寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读
  
 3)在不同的物理硬盘设备上重新分配磁盘活动;  
 如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不
。  


浏览 (1442) 评论 (1) 分类: 数据库 相关推荐 评论 
 
培训  
培训目的  
MySQL 数据库方面的基础培训,为了使项目组成员能够达到使用MySQL 数
  
培训对象  
  
常用词及符号说明  
  
:一种免费的跨平台的数据库系统  
:表示是在dos 命令窗口下面  
表示是在mysql 的命令行下  
参考信息  
 


 
连接MYSQL  
 mysql -h主机地址 -u用户名 -p用户密码  
  
 
  
 
  
 
  
 
:u与root可以不用加空格,其它也一样)  
path 里面要设定mysql的bin的路径:  
 
修改密码  
mysqladmin  
mysqladmin -u用户名 -p旧密码 password 新密码  
1:E:\mysql>mysqladmin -uroot password root  
root没有密码,所以-p旧密码一项就可以省略了。  
2:再将root的密码改为root123。  
 
 user 表  
 
 
 
 
 grant  
grant 权限 on 数据库.表格| 其他 to 用户@主机 IDENTIFIED BY 口令  
1:给test用户在本地localhost 所有权限(除了GRANT OPTION),口令为 test  
相当于修改了test 用户的口令)  
 
  
all on *.* to test @localhost identified by PASSWORD " 
 


2、增加一个用户test密码为abc,让他可以在任何主机上登录,并对test数据库有查询、
root用户连入MYSQL,然后键入以下命令:  
 


mysql.user 表中,有两个test 用户  
test 用户,在本地有所有的权限  
test 用户,在所有主机上有增删改查权限  


  
 
 
 mysql> FLUSH PRIVILEGES;  


用户不再使用用了,也可以删除  
 
 


例2增加的用户是比较危险的,你想如某个人知道test的密码,那么他就可以在internet
mysql数据库并对你的数据库test为所欲为了(可以通过限定
)  
地址" Identified by "abc";  
显示命令  
:  
 
 
  
 
  
 
:  
 
:  
 
:  
 
 
 
 
index:  
 
:  
 
 
MySQL数据库的版本:  
 
  
 
  
 
  
 
:  
 
:  
 
  
 
 INNODB 状态  
 
  
 
  
 


..  


创建.修改.删除  
创建数据库  
 
 


 
 
 
:  
如果不存在,则创建.  
设定字符集  
 
创建表  
 
 
 
:  
 
,  
 
 
 
设定主健  
设定字符集  
默认存储引擎  
 
MyISAM 存储引擎的表,在硬盘上存在3个文件  
 
 
 
 


 
 
 
 
 MEMORY 归档 ARCHIVE 等等  
不再使用了  


创建索引  
 
 
 
 
 


customer 表的name 字段前十个字符做为索引  
 
特性  
 MyISAM, InnoDB, or BDB 的表格上,可以在有null值的字段上创建索引  
 MyISAM, InnoDB, or BDB 的表格上,可以在BLOB TEXT 上创建索引  
MyISAM 类型表格上,可以在CHAR, VARCHAR, and TEXT 字段类型上创建FULLTEXT 索
  
 
 
 
 
  


 
 
 
修改表  
 
 
忽略主健重复的错误,如果重复,采用第一条,其余删除  
:同时多个操作  
 
, 重命名 INTEGER 字段,从 a 到 b:  
 
 修改字段类型,仍然需要新旧字段名称,即使字段名称相同:  
 
modify  
 


mysql 5.0 可以使用FIRST or AFTER 字段来添加add 字段,默认是在最后  
也可以使用  
mysql 5.0 InnoDB 存储引擎支持 ALTER TABLE 删除外健:  
 


:  
  
 
  
 
a 字段为 TINYINT NOT NULL , 并且 change 字段 b,从 CHAR(10) 到 CHAR(20) 并
c:  


 
 d:  
 
a d 上增加索引:  
 
c:  
 
c ,并且添加c 为主健:  
 
 
修改外键  
:  
 
 
 
 
 
:  
 
 
 


删除  
  
 
: mysql>drop DATABASE IF EXISTS testdb;  
  
 
 
 
: mysql>drop TABLE IF EXISTS testTable;  
  
 
: mysql>drop index testIndex on testTable;  
  
 
 
:RENAME TABLE current_db.tbl_name TO other_db.tbl_name;  
数据库备份恢复  
  
  
--opt --user=用户名 --password=密码 --default_character-set=字符集 -B数据库> 
sql文件  
:  
--user=ptsdb --password=ptsdb --default_character-set=ujis --opt 
 
  


  
--user=用户名 --password=密码 --default_character-set=字符集 [数据库]<导入的sql 
  


 


 对于InnoDB(没有设定字符集)  
mysqldump import example for InnoDB tables is at least 100x faster than previous 
 
 
 
 
 
 
 
 
 
 


  
 
 


 
 


 


 
 


 


 
DATABASE IF NOT EXISTS db_name and USE db_name statements are included in the 
 


 
 
 
 
 


 
 
 
 
  
表数据备份  
 
 
 
  
Mysqldump  
 
 
 
 mysql  
 
  
 select into OUTFILE  
select * from imptest where id=101 into OUTFILE 'e:\\mysql\\imp\\test3.txt' FIELDS 
 


 LOAD DATA INFILE  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  


 


mysqlimport:  
 
 


 
 
  
  
新数据导入数据表中之前删除数据数据表中的所有信息  
不管是否遇到错误,mysqlimport将强制继续插入数据  
跳过或者忽略那些有相同唯一  
这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录  
数据管道导入导出  
-h10.5.1.66 -uroot -proot --default-character-set=name 
 
输出的sql 语句)  


在新的server上建立空的数据库)  
在旧的服务器上导出数据库)  
在新的服务器上导入*.sql)  
.  
各种字段的取值范围  
 
 
 
即0-(28-1)  
 
即-215至(215-1)  
 
即0至(216-1)  
 
即?223至(223-1)  
 
即0至(224-1)  
或 INTEGER 4 bytes  
即?231至(231-1)  
或 INTEGER UNSIGNED 4 bytes  
即0至(232-1)  
 
即?263至(263-1)  
 
即0至(264-1)  
 
 
 
 
或 DOUBLE PRECISION 或 REAL 8 bytes  
 
 
 
或 NUMERIC(M,D) 不定  
M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和  
小数点右边的位数)来决定,M缺省为10,D缺省为0  
 
 
 
 
 
 
 
 
 
4位格式,4位格式取值范围为1901 - 2155,0000,2位格式取值范围为70-69(1970-2069)  
或 NCHAR(M) [BINARY] M bytes  
的范围为1 - 255,如果没有BINARY项,则不分大小写,NCHAR表示使用缺省的字符集.在数据
 中以空格补足,但在取出来时末尾的空格将被去掉.  
 
的范围为0?255 L+1 bytes L<=M  
以及以后 M 范围为 0-65535  
 
 
.  
或 TINYTEXT L+1 bytes  
个字符  
或 TEXT L+2 bytes  
个字符  
或 MEDIUMTEXT L+3 bytes  
个字符  
或 LONGTEXT L+4 bytes  
个字符  
 
65535个不同的值  
 
64个成员  
查询  
 
子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给
  
0开始(注意不是1),第二个参数
  
  
返回第6-15行数据  
返回前5行  
返回前5行  
详解  
 Create table 吧  


 
 
 
 


 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 


挑出左边的 table emp 中的所有资料,即使 emp_dept 中没有的资料也挑出来,没有的就
 NULL 来显示,  
也即显示资料是以左边的 table emp 中的资料为基础  


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
挑出 table emp 中有而 table emp_dept 中没有的人员资料  
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 


把 table emp_dept 放在左边的情形(当然以 emp_dept 中的数据为基础来显示资料,emp 
emp_dept 中多的资料也就不会显示出来了):  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
挑资料时以右边 table emp_dept 中的资料为基础来显示资料  
 
 
 
 
 
 
 
 
 
 
 
 
 
我们再把 table 的位置交换一下,再用 right join 试试  


 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
是不是和 left join 一样了?  
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
别名 alias  
GROUP BY、ORDER BY或在HAVING部分中使用别名引用列。别名也可以用来为列
  
 
 
 
你的 ANSI SQL 不允许你在一个WHERE子句中引用一个别名。这是因为在WHERE代
  
 
语句被执行以确定哪些行应该包括GROUP BY部分中,而HAVING用来决定应该只用
  
正则  
regex)是定义复杂查询的一个强有力的工具。  
  
  


hello只和字符串“hello”匹配。  
  
hello|word既能匹配字符串“hello”也能匹配字符串“word”。  
B[an]*s可以匹配字符串“Bananas”、“Baaaaa  
 
“Bs”以及其他任何以B开头以s结尾的字符串,中间可以包括任意个a和任意个n的组  
  
  
 
  
(表示不匹配)  
(表示匹配)  
 
  
(表示匹配)  
(表示不匹配)  
 
  
(表示匹配)  
(表示匹配)  
 
0-n多个a(包括空串)  
(表示匹配)  
(表示匹配)  
(表示匹配)  
 
1-n多个a(不包括空串)  
(表示匹配)  
(表示不匹配)  
 
0-1个a  
(表示匹配)  
(表示匹配)  
(表示不匹配)  
 
de或abc  
(表示匹配)  
(表示不匹配)  
(表示匹配)  
(表示匹配)  
(表示匹配)  
(表示不匹配)  
 
0-n个)abc(包括空串)  
(表示匹配)  
(表示不匹配)  
(表示匹配)  
 
 
  
 
a{0,}  
 
a{1,}  
 
a{0,1}  
{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,  
”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,  
”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下  
i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是25  
)。  
  
 
a”、“b”、“c”、“d”或“X”  
 
a”、“b”、“c”、“d”、“X”以外的任何字符。  
[”、“]”必须成对使用  
(表示匹配)  
(表示不匹配)  
(表示匹配)  
(表示不匹配)  
(表示匹配)  
(表示不匹配)  
 
 
,  
[[.ch.]]*c匹配chchcc的前五个字符  
  
 
o和(+)是  
[[=o=]]、[[=(+)=]]和[o(+)]是完全等价的。  
 
[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。  
: alnum、digit、punct、alpha、graph、space、blank、lower、uppe  
、cntrl、print和xdigit  
(表示匹配)  
(表示不匹配)  
 
 
alnum中  
  
(表示匹配)  
(表示不匹配)  
(表示  
  
中使用 IF Statement  
 
 
 
 
 
 
 
 
 
女','男') sex,name from test;  
 
 
 
女 | wang |  
男 | zhang |  
女 | li |  
 
 
中使用CASE Statement  
女' else '男' end) as sex,name from test;  
 
 
 
女 | wang |  
男 | zhang |  
女 | li |  
 


 
 
 
 
 
 
 
 
 
: 相当于Oracle 中的decode 和case when  
  


存储过程和函数  
 
 


 
 
 


 
 


 
 


 
 


 
 
 
 
 
 


 
 


hello,显示问候语  
 
 
 


 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 


 
2: 查询t表的记录总数  
 


 
 
 
 
 
 


 


 
 


 
 
 
 
 
 
 


  
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 


 
 
 
 
 
 
 


 
 
 
 
 
 
 


补充:trigger  
 
 
 
 
 
 
,  
 
 


 


 
 
 
 
 
 


 


 
 
 


 
 


 


 
 
 
 


 


 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


删除 DELETE Syntax  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
,不能使用order by 和limit  
: ,只是在删除 在from 前面的表所中匹配的记录  
 
t1,t2,t3 表选出要删除的记录,只是删除t1,t2 表中所匹配得这些记录.  
: 在from 列出的表中删除选中的记录.  
 
t1,t2,t3 表选出要删除的记录(使用using ),只是删除t1,t2 表中所匹配得这些记录.  


: 如果您使用一个别名,您必须使用别名.  


 


,但是在这种情况下,你必须指定表,而不能使用别名:  


 
,您不能从相同表的子查询中,删除同一表的数据  




 1 星期前  
错误:文件无法打开,使用后台修复或者使用phpmyadmin进行修复。  
错误:数据库用户权限不足,请联系空间商解决  
错误:数据库服务器/数据库用户名/数据库名/数据库密码错误,请联系空间商检查帐
  
错误:程序文件跟数据库有冲突,请使用正确的程序文件上传上去覆盖。  
错误:数据表缺失,请恢复备份数据.  
:创建表失败  
:创建数据库失败  
:数据库已存在,创建数据库失败  
:数据库不存在,删除数据库失败  
:不能删除数据库文件导致删除数据库失败  
:不能删除数据目录导致删除数据库失败  
:删除数据库文件失败  
:不能读取系统表中的记录  
:记录已被其他用户修改  
:硬盘剩余空间不足,请加大硬盘可用空间  
:关键字重复,更改记录失败  
:关闭时发生错误  
:读文件错误  
:更改名字时发生错误  
:写文件错误  
:记录不存在  
:数据表是只读的,不能对它进行修改  
:系统内存不足,请重启数据库或重启服务器  
:用于排序的内存不足,请增大排序缓冲区  
:已到达数据库的最大连接数,请加大数据库可用连接数  
:系统内存不足  
:无效的主机名  
:无效连接  
:当前用户没有访问数据库的权限  
:不能连接数据库,用户名或密码错误  
:字段不能为空  
:数据库不存在  
:数据表已存在  
:数据表不存在  
:字段不存在  
:无效的SQL语句,SQL语句为空  
:不能建立Socket连接  
:数据表已满,不能容纳任何记录  
:打开的数据表太多  
:数据库出现异常,请重启数据库  
:连接数据库失败,没有连接数据库的权限  
:数据库用户不存在  
:当前用户无权访问数据库  
:当前用户无权访问数据表  
:当前用户无权访问数据表中的字段  
:数据表不存在  
:未定义用户对数据表的访问权限  
:SQL语句语法错误  
:网络错误,出现读错误,请检查网络连接状况  
:网络错误,读超时,请检查网络连接状况  
:网络错误,出现写错误,请检查网络连接状况  
:网络错误,写超时,请检查网络连接状况  
:字段值重复,入库失败  
:字段值重复,更新记录失败  
:打开数据表失败  
:提交事务失败  
:回滚事务失败  
:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接
  
:加锁超时  
:当前用户没有创建用户的权限  
:外键约束检查失败,更新子表记录失败  
:外键约束检查失败,删除或修改主表记录失败  
:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器  
:权限不足,您无权进行此操作  
:MySQL版本过低,不具有本功能  
:Can't connect to ...通常意味着没有一个MySQL服务器运行在系统上或当试图连接
服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。  


以上只是常见错误号,并且解决办法也不一定肯定管用!具体请参考MYSQL手册(各
  


  
 / 错误代码 SQL状态  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 




 1 星期前  
备份和恢复  
 


/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能
  


2006/10/01  


 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:
和 Innodb,文中设计的 MySQL 版本为 5.0.22。  


 MySQL 支持的免费备份工具有:mysqldump、mysqlhotcopy,还可以用 SQL 语法进行
BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者备份二进制日志(binlog),还可以
MyISAM 表是保存成文件的形式,因此相对比较容
Innodb 所有的表都保存在同一个数据文件 
中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免
 binlog,或者用 mysqldump。  
、mysqldump  
备份  


是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 
  
 mysqldump 的一些主要参数:  


 


 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。
 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、
、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并
  
,-c  


 INSERT 方式,也就是把所有的值都写在一行。这么做能
 max_allowed_packet 参数的影响而导致插入失败。因此,
  
 


 latin1 字符集的话,那么导
  
 


 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE 
和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速
 MyISAM 表。  
 


mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选
 false 即可。  
 


如果有二进制数据就必须使用本选项。影响到的
 BINARY、VARBINARY、BLOB。  
,-x  


提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全
 --single-transaction 和 --lock-tables 选项。  
 


 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的
 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。  
,-t  


 CREATE TABLE 语句。  
,-d  


  
 


只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option 
--extended-insert --lock-tables --quick --set-charset 选项。本选项能让 
很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 
禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个
  
,-q  


它强制 mysqldump 从服务器查询取得记录直接输出而不是取
  
,-R  


  
 


 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证
 InnoDB 和 BDB。  
 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。  
 --quick 选项。  
 


 --skip-triggers 禁用它。  


 SQL 来备份 MyISAM 表:  


 
 
 


 SQL 来备份 Innodb 表:  


 
 
 


 --master-data 参数来实现,如下:  


 
 
 


binlog了,而后在导出的文件中加入CHANGE 
语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以
  
还原  


 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据
  


直接用 mysql 客户端  


  


 




用 SOURCE 语法  


 SQL 语法,而是 mysql 客户端提供的功能,例如:  


 


 mysqld 运行用户(例如 nobody)有权限读取的
  


、 mysqlhotcopy  
备份  


是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH 
和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只


只能用于备份 MyISAM,并且只能运行在 类Unix 和 NetWare 系统上。  


支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:  


 
把数据库目录 db_name 拷贝到 /tmp 下)  
 
 
 
 


 mysqlhotcopy 的帮助:  


 


 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,
 datadir/db_name 目录的权限。  
还原  


备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 
在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:  


 
-R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 
)  




、 SQL 语法备份  
备份  


TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文
但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文
  
  


 


必须要有 FILE 权限才能执行本SQL,并且目录 /tmp/db_name/ 必须能被 mysqld 用
  


则是把数据导出来成为普通的文本文件,可以自定义字段间隔的方式,
  
  


 


 FILE 权限才能执行本SQL,并且文件 /tmp/db_name/tbl_name.txt 必须能
 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。  
恢复  


 BACKUP TABLE 方法备份出来的文件,可以运行 RESTORE TABLE 语句来恢复数据表。  
  


 


  


 SELECT INTO OUTFILE 方法备份出来的文件,可以运行 LOAD DATA INFILE 语句来恢复数
  
  


 


倒入数据之前,数据表要已经存在才行。如果担心数据会发生重复,
 REPLACE 关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。  
、 启用二进制日志(binlog)  


 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。  


 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 my.cnf,加入以下几行:  


 
 
 


 mysqld 就可以了。运行过程中会产生 binlog.000001 以及 binlog.index,前面的
 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能
 binlog 的信息请查看手册。  


可以先执行一下 SQL 语句,让 mysqld 终止对当前 binlog 的写入,就可以把
  


 


 master.info 和 relay-log.info 文件。  


 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 来查看,如:  


 


 SQL 语句,并且还可以限定时间范围,相当的方
  


  


 


 mysqlbinlog 输出的 SQL 语句直接作为输入来执行它。  


不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是
因此成本低,用低成本就能实现增量备份而且还能分担一部分数据查询压力,何乐
  
、 直接备份数据文件  




 SQL 语句:  


 


同时锁定数据表,以保证拷贝过程中不会有新的数
  


对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 
  
、 备份策略  


备份策略可以这么定:第一次全量备份,每天一次增量备
而对于重要的且繁忙的系统来说,则可能需要
每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备
并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备
  
、 数据维护和灾难恢复  


DBA(我目前还不是,呵呵),最重要的工作内容之一是保证数据表能安全、稳定、
 SQL 语句就很有用:  


或 REPAIR TABLE,检查或维护 MyISAM 表  
,优化 MyISAM 表  
,分析 MyISAM 表  


 myisamchk 来完成,在这里不作详述。  


表则可以通过执行以下语句来整理碎片,提高索引速度:  


 


 NULL 操作,表面上看什么也不做,实际上重新整理碎片了。  


 MyISAM 表可以用上面提到的恢复方法来完成。如果是索引坏了,可以用 
工具来重建索引。而对于 Innodb 表来说,就没这么直接了,因为它把所有的表
 Innodb 有一个检查机制叫 模糊检查点,只要保存了日志文
 my.cnf 文件中,增加以下参数,让 mysqld 在
  


 


  
、 总结  


定只好合适的备份策略,这是一个DBA所做事情的一小部分,万事开头难,
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值