详述MySQL数据库和备份与恢复

60 views
Skip to first unread message

marc...@gmail.com

unread,
Aug 11, 2005, 10:51:41 PM8/11/05
to Marco Lu's Group

在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。有时,正是MySQL管理员造成破坏。管理员已经知道表以破坏,用诸如vi或Emacs等编辑器试图直接编辑它们,这对表绝对不是件好事!


备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件(如用cp、cpio或tar等)。每种方法都有其优缺点:

mysqldump与MySQL服务器协同操作。直接拷贝方法在服务器外部进行,并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数据库,也会发生同样的问题:如果数据库表在文件系统备份过程中被修改,进入备份的表文件主语不一致的状态,而对以后的恢复表将失去意义。文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程,这样你能采取措施确保服务器让表不受干扰。


mysqldump比直接拷贝要慢些。


mysqldump生成能够移植到其它机器的文本文件,甚至那些有不同硬件结构的机器上。直接拷贝文件不能移植到其它机器上,除非你正在拷贝的表使用MyISAM存储格式。ISAM表只能在相似的硬件结构的机器上拷贝。在MySQL
3.23中引入的MyISAM表存储格式解决了该问题,因为该格式是机器无关的,所以直接拷贝文件可以移植到具有不同硬件结构的机器上。只要满足两个条件:另一台机器必须也运行MySQL
3.23或以后版本,而且文件必须以MyISAM格式表示,而不是ISAM格式。


不管你使用哪种备份方法,如果你需要恢复数据库,有几个原则应该遵守,以确保最好的结果:


定期实施备份。建立一个计划并严格遵守。


让服务器执行更新日志。当你在崩溃后需要恢复数据时,更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后,你可以通过运行更新日志中的查询再次运用备份后面的修改,这将数据库中的表恢复到崩溃发生时的状态。

以文件系统备份的术语讲,数据库备份文件代表完全倾倒(full
dump),而更新日志代表渐进倾倒(incremental dump)。


使用一种统一的和易理解的备份文件命名机制。象backup1、buckup2等不是特别有意义。当实施你的恢复时,你将浪费时间找出文件里是什么东西。你可能发觉用数据库名和日期构成备份文件名会很有用。例如:


%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
%mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02


你可能想在生成备份后压缩它们。备份一般都很大!你也需要让你的备份文件有过期期限以避免它们填满你的磁盘,就象你让你的日志文件过期那样。

用文件系统备份备份你的备份文件。如果遇上了一个彻底崩溃,不仅清除了你的数据目录,也清除了包含你的数据库备份的磁盘驱动器,你将真正遇上了麻烦。也要备份你的更新日志。


将你的备份文件放在不同于用于你的数据库的文件系统上。这将降低由于生成备份而填满包含数据目录的文件系统的可能性。

用于创建备份的技术同样对拷贝数据库到另一台机器有用。最常见地,一个数据库被转移到了运行在另一台主机上的服务器,但是你也可以将数据转移到同一台主机上的另一个服务器。

1、使用mysqldump备份和拷贝数据库
当你使用mysqldumo程序产生数据库备份文件时,缺省地,文件内容包含创建正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句。换句话说,mysqldump产生的输出可在以后用作mysql的输入来重建数据库。


你可以将整个数据库倾倒进一个单独的文本文件中,如下:

%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

输出文件的开头看起来象这样:

# MySQL Dump 6.0
#
# Host: localhost Database: samp_db
#---------------------------------------
# Server version 3.23.2-alpha-log
#
# Table structure for table 'absence'
#
CREATE TABLE absence(
student_id int(10) unsigned DEFAULT '0' NOT NULL,
date date DEFAULT '0000-00-00' NOT NULL,
PRIMARY KEY (student_id,date)
);
#
# Dumping data for table 'absence'
#
INSERT INTO absence VALUES (3,'1999-09-03');
INSERT INTO absence VALUES (5,'1999-09-03');
INSERT INTO absence VALUES (10,'1999-09-08');
......

文件剩下的部分有更多的INSERT和CREATE
TABLE语句组成。

如果你想压缩备份,使用类似如下的命令:

%mysqldump samp_db | gzip
>/usr/archives/mysql/samp_db.1999-10-02.gz


如果你要一个庞大的数据库,输出文件也将很庞大,可能难于管理。如果你愿意,你可以在mysqldump命令行的数据库名后列出单独的表名来倾到它们的内容,这将倾倒文件分成较小、更易于管理的文件。下例显示如何将samp_db数据库的一些表倾到进分开的文件中:


%mysqldump samp_db student score event absence >grapbook.sql
%mysqldump samp_db member president >hist-league.sql


如果你生成准备用于定期刷新另一个数据库内容的备份文件,你可能想用--add-drop-table选项。这告诉服务器将DROP
TABLE IF
EXISTS语句写入备份文件,然后,当你取出备份文件并把它装载进第二个数据库时,如果表已经存在,你不会得到一个错误。

如果你倒出一个数据库以便能把数据库转移到另一个服务器,你甚至不必创建备份文件。要保证数据库存在于另一台主机,然后用管道倾倒数据库,这样mysql能直接读取mysqldump的输出。例如:你想从主机pit-viper.snake.net拷贝数据库samp_db到boa.snake.net,可以这样很容易做到:

%mysqladmin -h boa.snake.net create
samp_db
%mysqldump samp_db | mysql -h boa.snake.net samp_db

以后,如果你想再次刷新boa.snake.net上的数据库,跳过mysqladmin命令,但要对mysqldump加上--add-drop-table以避免的得到表已存在的错误:

%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqldump其它有用的选项包括:


--flush-logs和--lock-tables组合将对你的数据库检查点有帮助。--lock-tables锁定你正在倾倒的所有表,而--flush-logs关闭并重新打开更新日志文件,新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。(然而如果你有需要执行个更新的客户,锁定所有表对备份期间的客户访问不是件好事。)
如果你使用--flush-logs设置检查点到备份时,有可能最好是倾倒整个数据库。如果你倾倒单独的文件,较难将更新日志检查点与备份文件同步。在恢复期间,你通常按数据库为基础提取更新日志内容,对单个表没有提取更新的选择,所以你必须自己提取它们。


缺省地,mysqldump在写入前将一个表的整个内容读进内存。这通常确实不必要,并且实际上如果你有一个大表,几乎是失败的。你可用--quick选项告诉mysqldump只要它检索出一行就写出每一行。为了进一步优化倾倒过程,使用--opt而不是--quick。--opt选项打开其它选项,加速数据的倾倒和把它们读回。


用--opt实施备份可能是最常用的方法,因为备份速度上的优势。然而,要警告你,--opt选项确实有代价,--opt优化的是你的备份过程,不是其他客户对数据库的访问。--opt选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。当你的数据库一般非常频繁地使用,只是一天一次地调节备份。

一个具有--opt的相反效果的选项是--dedayed。该选项使得mysqldump写出INSERT
DELAYED语句而不是INSERT语句。如果你将数据文件装入另一个数据库并且你想是这个操作对可能出现在该数据库中的查询的影响最小,--delayed对此很有帮助。

--compress选项在你拷贝数据库到另一台机器上时很有帮助,因为它减少网络传输字节的数量。下面有一个例子,注意到--compress对与远端主机上的服务器通信的程序才给出,而不是对与本地主机连接的程序:

%mysqldump --opt samp_db | mysql --compress -h boa.snake.net
samp_db
mysqldump有很多选项,详见《MySQL参考手册》。

2、使用直接拷贝数据库的备份和拷贝方法


另一种不涉及mysqldump备份数据库和表的方式是直接拷贝数据库表文件。典型地,这用诸如cp、tar或cpio实用程序。本文的例子使用cp。


当你使用一种直接备份方法时,你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它,拷贝就失去意义。


保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,而且你应该使用相同的锁定协议让服务器"安静下来"。


假设服务器关闭或你已经锁定了你想拷贝的表,下列显示如何将整个samp_db数据库备份到一个备份目录(DATADIR表示服务器的数据目录):


%cd DATADIR&
%cp -r samp_db /usr/archive/mysql
单个表可以如下备份:

%cd DATADIR/samp_db
%cp member.* /usr/archive/mysql/samp_db
%cp score.* /usr/archive/mysql/samp_db
....


当你完成了备份时,你可以重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。

要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是MyIASM格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。


3、复制数据库(Replicating Database)


复制(Replication)类似于拷贝数据库到另一台服务器上,但它的确切含义是实时地保证两个数据库的完全同步。这个功能将在3.23版中出现,而且还不很成熟,因此本文不作详细介绍。

4、用备份恢复数据


数据库损坏的发生有很多原因,程度也不同。如果你走运,你可能仅损坏一两个表(如掉电),如果你倒霉,你可能必须替换整个数据目录(如磁盘损坏)。在某些情况下也需要恢复,比如用户错误地删除了数据库或表。不管这些倒霉事件的原因,你将需要实施某种恢复。

如果表损坏但没丢失,尝试用myisamchk或isamchk修复它们,如果这样的损坏可有修复程序修复,你可能根本不需要使用备份文件。关于表修复的过程,见《数据库维护与修复》。

恢复过程涉及两种信息源:你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态,然而一般表在备份与发生问题之间的时间内已经被修改,更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为mysql的输入来重复查询。这已正是为什么要启用更新日志的原因。

恢复过程视你必须恢复的信息多少而不同。实际上,恢复整个数据库比单个表跟容易,因为对于数据库运用更新日志比单个表容易。


4.1 恢复整个数据库


首先,如果你想恢复的数据库是包含授权表的mysql数据库,你需要用--skip-grant-table选项运行服务器。否则,它会抱怨不能找到授权表。在你已经恢复表后,执行mysqladmin
flush-privileges告诉服务器装载授权标并使用它们。


将数据库目录内容拷贝到其它某个地方,如果你在以后需要它们。

用最新的备份文件重装数据库。如果你用mysqldump产生的文件,将它作为mysql的输入。如果你用直接从数据库拷贝来的文件,将它们直接拷回数据库目录,然而,此时你需要在拷贝文件之前关闭数据库,然后重启它。

使用更新日志重复做备份以后的修改数据库表的查询。对于任何可适用的更新日志,将它们作为mysql的输入。指定--one-database选项使得mysql只执行你有兴趣恢复的数据库的查询。如果你知道你需要运用所有更新日志文件,你可以在包含日志的目录下使用这条命令:


% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database
db_name


ls命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(主意:如果你修改任何一个文件,你将改变排序次序,这导致更新日志一错误的次序被运用。)


很可能你会是运用某几个更新日志。例如,自从你备份以来产生的更新日志被命名为update.392、update.393等等,你可以这样重新运行:


%mysql --one-database db_name < update.392
%mysql --one-database db_name < update.393
.....


如果你正在实施恢复且使用更新日志恢复由于一个错误建议的DROP
DATABASE、DROP
TABLE或DELETE语句造成丢失的信息,在运用更新日志之前,要保证从其中删除这些语句。


4.2 恢复单个表


恢复单个表较为复杂。如果你用一个由mysqldump生成的备份文件,并且它不包含你感兴趣的表的数据,你需要从相关行中提取它们并将它们用作mysql的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉mysql_find_rows实用程序对此很有帮助,它从更新日志中提取多行查询。


另一个可能性是使用另一台服务器恢复整个数据库,然后拷贝你想要的表文件到原数据库中。这可能真的很容易!当你将文件拷回数据库目录时,要确保原数据库的服务器关闭

marc...@gmail.com

unread,
Aug 17, 2005, 11:01:10 PM8/17/05
to Marco Lu's Group
导出要用到MySQL的mysqldump工具,基本用法是:

shell> mysqldump [OPTIONS] database [tables]

如果你不给定任何表,整个数据库将被导出。

通过执行mysqldump
--help,你能得到你mysqldump的版本支持的选项表。

注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。


mysqldump支持下列选项:

--add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK
TABLE。(为了使得更快地插入到MySQL)。
--add-drop-table
在每个create语句之前增加一个drop table。
--allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。

-c, --complete-insert
使用完整的insert语句(用列名字)。
-C, --compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。

--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)

-#, --debug[=option_string]
跟踪程序的使用(为了调试)。
--help
显示一条帮助消息并且退出。
--fields-terminated-by=...
 
--fields-enclosed-by=...
 
--fields-optionally-enclosed-by=...
 
--fields-escaped-by=...
 
--fields-terminated-by=...
这些选择与-T选择一起使用,并且有相应的LOAD DATA
INFILE子句相同的含义。
LOAD DATA INFILE语法。
-F, --flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。
-f, --force,
即使我们在一个表导出期间得到一个SQL错误,继续。

-h, --host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。

-l, --lock-tables.
为开始导出锁定所有表。
-t, --no-create-info
不写入表创建信息(CREATE TABLE语句)
-d, --no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!

--opt
同--quick --add-drop-table --add-locks --extended-insert
--lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。

-pyour_pass, --password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。

-P port_num, --port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用
Unix套接字。)
-q, --quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。

-S /path/to/socket, --socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。

-T, --tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL
CREATE 命令,和一个table_name.txt文件,它包含数据。
注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和--lines--xxx选项来定。

-u user_name, --user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。

-O var=option, --set-variable
var=option设置一个变量的值。可能的变量被列在下面。

-v, --verbose
冗长模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息并且退出。
-w, --where='where-condition'
只导出被选择了的记录;注意引号是强制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"

最常见的mysqldump使用可能制作整个数据库的一个备份:


mysqldump --opt database > backup-file.sql

但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:


mysqldump --opt database | mysql --host=remote-host -C database

由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:


shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql
就是
shell> mysql 库名 < 文件名

marc...@gmail.com

unread,
Aug 17, 2005, 11:01:36 PM8/17/05
to Marco Lu's Group
Mysql数据库介绍

MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准
化的数据库语言。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的
客户程序和库组成。


SQL是一种标准化的语言,它使得存储、更新和存取信息更容易。例如,你能用SQL语言为一个网站检索
产品信息及存储顾客信息,同时MySQL也足够快和灵活以允许你存储记录文件和图像。

MySQL
主要目标是快速、健壮和易用。最初是因为我们需要这样一个SQL服务器,它能处理与任何可不昂
贵硬件平台上提供数据库的厂家在一个数量级上的大型数据库,但速度更快,MySQL就开发出来。自1996年以
来,我们一直都在使用MySQL,其环境有超过 40
个数据库,包含 10,000个表,其中500多个表超过7百万行
,这大约有100 个吉字节(GB)的关键应用数据。

Mysql数据库特点
1.
使用核心线程的完全多线程。这意味着它能很容易地利用多CPU(如果有)。

2. 可运行在不同的平台上。
3. 多种列类型:1、 2、 3、4、和 8
字节长度的有符号/无符号整数(INT)、FLOAT、DOUBLE、CHAR、
VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、
TIMESTAMP、YEAR、SET和ENUM类型。
4. 利用一个优化的一遍扫描多重联结(one-sweep
multi-join)非常快速地进行联结(join)。
5. 在查询的SELECT和WHERE部分支持全部运算符和函数。
6.
通过一个高度优化的类库实现SQL函数库并且像他们能达到的一样快速,通常在查询初始化后不应该有任
何内存分配。
7. 全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数(
COUNT()、COUNT(DISTINCT)、AVG()、STD()、
SUM()、 MAX()和MIN() )。
8. 支持ANSI SQL的LEFT OUTER JOIN和ODBC语法。
9. 你可以在同一查询中混用来自不同数据库的表。
10.
一个非常灵活且安全的权限和口令系统,并且它允许基于主机的认证。口令是安全的,因为当与一个服
务器连接时,所有的口令传送被加密。
11. ODBC for Windiws 95。
12. 具备索引压缩的快速B树磁盘表。
13.
每个表允许有16个索引。每个索引可以由1~16个列或列的一部分组成。最大索引长度是
256 个字节(在

编译MySQL时,它可以改变)。一个索引可以使用一个CHAR或VARCHAR字段的前缀。

14. 定长和变长记录。
15. 用作临时表的内存散列表。
16. 大数据库处理。我们正在对某些包含 50,000,000
个记录的数据库使用MySQL。
17.
所有列都有缺省值,你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的缺省
值。
18. 一个非常快速的基于线程的内存分配系统。
19.
没有内存漏洞。用一个商用内存漏洞监测程序测试过(purify)。

20.
包括myisamchk,一个检查、优化和修复数据库表的快速实用程序。

21. 全面支持ISO-8859-1 Latin1 字符集。
22. 所有数据以 ISO-8859-1 Latin1
格式保存。所有正常的字符串比较是忽略大小写的。
23. DELETE、INSERT、REPLACE和UPDATE
返回有多少行被改变(受影响)。
24.
函数名不会与表或列名冲突。例如ABS是一个有效的列名字。对函数调用的唯一限制是函数名与随后的
"("不能有空格。
25. 所有MySQL程序可以用选项--help或-?获得联机帮助。
26. 服务器能为客户提供多种语言的出错消息。
27. 客户端使用TCP/IP
连接或Unix套接字(socket)或NT下的命名管道连接MySQL。

28.
MySQL特有的SHOW命令可用来检索数据库、表和索引的信息,EXPLAIN命令可用来确定优化器如何解决一
个查询。

MySQL服务器的启动与停止

一、启动服务器的方法
启动服务器由三种主要方法:

1、 直接调用mysqld。
#./mysqld&
这可能是最不常用的方法,建议不要多使用。

2、调用safe_mysqld脚本,最好的方法。
#./safe_mysqld -O join_buffer=128M -O key_buffer=128M -O
record_buffer=256M -O sort_buffer=128M -O table_cache=2048 -O
tmp_table_size=16M -O max_connections=2048 &

3、调用mysql.server脚本。
safe_mysqld脚本安装在MySQL安装目录的bin目录下,或可在MySQL源代码分发的scripts目录下找到。
mysql.server脚本安装在MySQL安装目录下的share/mysqld目录下或可以在MySQL源代码分发的support_files
目录下找到。如果你想使用它们,你需要将它们拷贝到适当的目录下mysql/bin下。
#./mysql.server start

Sun Solariys开机自动启mysql的方法
写一个启动和关闭的批处理文件Web (在路径/etc/init.d
下), 内容如下:

#!/bin/sh
OPT_=$1

case "$OPT_" in
start)
/bin/echo "$0 : (start)"
#
# Your service startup command goes here.
#
/usr/local/apache/bin/apachectl start
/home3/mysql/bin/safe_mysqld -O join_buffer=128M -O
key_buffer=128M -O record_buffer=256M -O sort_buffer=128M -O
table_cache=2048 -O tmp_table_size=16M -O max_connections=2048 &

# NOTE: Must exit with zero unless error is severe.
exit 0
;;
stop)
/bin/echo "$0 : (stop)"
#
# Your service shutdown command goes here.
#
/usr/local/apache/bin/apachectl stop

# NOTE: Must exit with zero unless error is severe.
exit 0
;;
*) /bin/echo ''
/bin/echo "Usage: $0 [start|stop]"
/bin/echo " Invalid argument ==> \"${OPT_}\""
/bin/echo ''
exit 0
;;
esac
确认此文件有可执行的权利
#chmod 500 web
#cd /etc/rc2.d
#ln -s ../init.d/web S99mysql
在系统启动时,S99mysql脚本将自动用一个start参数调用。注意头字母必须大写。

二、停止服务器的方法
1、要手工停止服务器,使用mysqladmin:
#mysqladmin -u 用户名 -p'密码' shutdown
2、 调用mysql.server脚本,最好的方法。
#./mysql.server stop
3、 直接杀掉OS的进程号
#kill -9 进程号
这可能是最不常用的方法,建议不要多使用。

要自动停止服务器,你不需做特别的事情。只需要加另外一个关闭程序。
#cd /etc/rc0.d
#ln -s ../init.d/web K01mysql
在系统启动时,K01mysql脚本将自动用一个stop参数调用。

MySQL目录结构和常用命令
一、 数据目录的位置
这是默认的mysql目录结构
bin info libexec share var
include lib man sql-bench

一个缺省数据目录被编译进了服务器,如果你从一个源代码分发安装MySQL,典型的缺省目录为
/usr/local/var,如果从RPM文件安装则为/var/lib/mysql,如果从一个二进制分发安装则是
/usr/local/mysql/data。
作为一名MySQL管理员,你应该知道你的数据目录在哪里。如果你运行多个服务器,你应该是到所有数据目录
在哪里,但是如果你不知道确切的位置,由多种方法找到它:

1、使用mysqladmin
variables从你的服务器直接获得数据目录路径名。查找datadir变量的值,在Unix上,其输出类似于:
%mysqladmin -u username -p'*****' variables

+----------------------+----------------------+
| variable_name | Value |
+----------------------+----------------------+
| back_log | 5 |
| connect_timeout | 5 |
| basedir | /var/local/ |
| datadir | /usr/local/var/ |
....
2、查找mysql运行的路径
%ps -ef | grep mysqld

二、数据目录结构
每个数据库对应于数据目录下的一个目录。
在一个数据库中的表对应于数据目录下的文件。
数据目录也包含由服务器产生的几个状态文件,如日志文件。这些文件提供了关于服务器操作的重要信息。
对管理特别在出了问题而试图确定问题原因时很有价值。

1、数据库表的表示
数据库目录中有3种文件:一个样式(描述文件)、一个数据文件和一个索引文件。每个文件的基本名是表
名,文件名扩展名代表文件类型。扩展名如下表。数据和索引文件的扩展名指出表使用老式IASM索引或新式
MyISAM索引。

MySQL文件类型
文件类型 文件名扩展名 文件内容
样式文件 .frm
描述表的结构(它的列、列类型、索引等)
数据文件 .ISD(ISAM)或.MYD(MyISAM) 包含表里所有的数据
索引文件 .ISM(ISAM)或.MYI(MyISAM)
包含数据文件上的所有索引的索引树


当你发出一条CREATE TABLE
tbl_name时语句定义表的结构时,服务器创建一个名为tbl_name.frm的文件,它
包括该结构的内部编码,同时也创建一个空数据和索引文件,初始化为包含指出无记录和无索引的信息(如
果CREATE
TABLE语句包括索引指定,索引文件反映出这些索引)。对应于表的文件的属主和模式被设置为只
允许MySQL服务器用户访问。

下面介绍一下常用的mysql命令
进入mysql数据库
#./mysql -u 用户名 -p'密码'
查看所有的数据库
mysql> show databases;
进入一个特定的数据库
mysql> use 数据库名;
查看数据库里所有的表
mysql> show tables;
把表改名
mysql> alter table 表名1 rename 表名2;
例子:mysql>alter table dept rename dept2;

2、 建索引的注意事项:
先要把要加索引的字段设为非空
mysql> alter table 表名 change 字段名 字段名 字段描述 not
null;
例子:
我们创建这样一个表
mysql> create table employee
( id int(5) not null,
depno int(5),
name varchar(20) not null,
cardnumber bigint(15) not null);

mysql> alter table employee change depno depno int(5) not null;
加索引
mysql> alter table 表名 add index 索引名 (字段名1[,字段名2
...]);
例子: mysql> alter table employee add index emp_name (name);

加主关键字的索引
mysql> alter table 表名 add primary key (字段名);
例子: mysql> alter table employee add primary key(id);

加唯一限制条件的索引
mysql> alter table 表名 add unique 索引名 (字段名);
例子: mysql> alter table employee add unique emp_name2(cardnumber);

查看某个表的索引
mysql> show index from 表名;
例子: mysql> show index from employee;

删除某个索引
mysql> alter table 表名 drop index 索引名;
例子: mysql>alter table employee drop index emp_name;

MySQL用户管理
MySQL管理员应该知道如何设置MySQL用户账号,指出哪个用户可以连接服务器,从哪里连接,连接后能做什
么。MySQL
3.22.11开始引入两条语句使得这项工作更容易做:GRANT语句创建MySQL用户并指定其权限,而
REVOKE语句删除权限。两条语句扮演了mysql数据库的前端角色,并提供与直接操作这些表的内容不同的另一
种方法。CREATE和REVOKE语句影响4个表:

授权表内容:
user 能连接服务器的用户以及他们拥有的任何全局权限

db 数据库级权限
tables_priv 表级权限
columns_priv 列级权限

还有第5个授权表(host),但它不受GRANT和REVOKE的影响。
当你对一个用户发出一条GRANT语句时,在user表中为该用户创建一条记录。如果语句指定任何全局权限(管
理权限或适用于所有数据库的权限),这些也记录在user表中。如果你指定数据库、表和列级权限,他们被
分别记录在db、tables_priv和columns_priv表中。

在下面的章节中,我们将介绍如何设置MySQL用户账号并授权。我们也涉及如何撤权和从授权表中删除用户。

一、创建用户并授权
GRANT语句的语法看上去像这样:

GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION 
要使用该语句,你需要填写下列部分:

privileges
授予用户的权限,下表列出可用于GRANT语句的权限指定符:
权限指定符 权限允许的操作:
ALTER 修改表和索引
CREATE 创建数据库和表
DELETE 删除表中已有的记录
DROP 抛弃(删除)数据库和表
INDEX 创建或抛弃索引
INSERT 向表中插入新行
REFERENCE 未用
SELECT 检索表中的记录
UPDATE 修改现存表记录
FILE 读或写服务器上的文件
PROCESS 查看服务器中执行的线程信息或杀死线程
RELOAD 重载授权表或清空日志、主机缓存或表缓存。
SHUTDOWN 关闭服务器
ALL 所有;ALL PRIVILEGES同义词
USAGE 特殊的"无权限"权限

columns
权限运用的列,它是可选的,并且你只能设置列特定的权限。如果命令有多于一个列,应该用逗号分开它们.

what
权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的
所有表)或特定表的。可以通过指定一个columns字句是权限是列特定的。

user
权限授予的用户,它由一个用户名和主机名组成。MySQL中的一个用户名就是你连接服务器时指定的用户名,
该名字不必与你的Unix登录名或Windows名联系起来。缺省地,如果你不明确指定一个名字,客户程序将使用
你的登录名作为MySQL用户名。这只是一个约定。你可以在授权表中将该名字改为nobody,然后以nobody连接
执行需要超级用户权限的操作。

password
赋予用户的口令,它是可选的。如果你对新用户没有指定IDENTIFIED
BY子句,该用户不赋给口令(不安全)。
对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用IDENTIFIED
BY
时,口令字符串用改用口令的字面含义,GRANT将为你编码口令,不要象你用SET
PASSWORD 那样使用password()
函数。

WITH GRANT
OPTION子句是可选的。如果你包含它,用户可以授予权限通过GRANT语句授权给其它用户。你可
以用该子句给与其它用户授权的能力。

用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。
举例:创建一个超级用户test1
mysql> grant all privilleges on *.* to test1@localhost identified by
'123456' with grant option;
创建一个只能查询的用户 test2
mysql> grant select on *.* to test2@localhost identified by '9876543';

二、撤权并删除用户
要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有
INDETIFED BY和WITH GRANT OPTION子句:

REVOKE privileges (columns) ON what FROM user

user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT
语句授权,然后用REVOKE语句只撤销部分权限。REVOKE语句只删除权限,而不删除用户。即使你撤销了所有
权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须
用一条DELETE语句明确从user表中删除用户记录:

#mysql -u root mysql
mysql>DELETE FROM user
->WHERE User="user_name" and Host="host_name";
mysql>FLUSH PRIVILEGES; 
DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动
重载,而你直接修改授权表时不是。)
举例:删除用户test1
mysql> revoke all on *.* from test2@localhost;
mysql> use mysql;
mysql> delete from user where user='test' and host='localhost';
mysql> flush privileges;
MySQL数据库备份
在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。已经知道表被破坏,用诸如vi或Emacs等编辑
器试图直接编辑它们,这对表绝对不是件好事!

备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件(如用cp、cpio或tar等)。每种方法都
有其优缺点:

mysqldump与MySQL服务器协同操作。直接拷贝方法在服务器外部进行,并且你必须采取措施保证没有客户正
在修改你将拷贝的表,一般在数据库关闭情况下做。mysqldump比直接拷贝要慢些。mysqldump生成能够移植
到其它机器的文本文件,甚至那些有不同硬件结构的机器上。直接拷贝文件可以移植到同类机器上,但不能
移植到其它机器上,除非你正在拷贝的表使用MyISAM存储格式。

一、使用mysqldump备份和拷贝数据库
当你使用mysqldump程序产生数据库备份文件时,缺省地,文件内容包含创建正在倾倒的表的CREATE语句和包
含表中行数据的INSERT语句。换句话说,mysqldump产生的输出可在以后用作mysql的输入来重建数据库。

Mysqldump参数如下:
#mysqldump -u 用户名-p'密码' 数据库名 [表名] >
操作系统下文件名

举例:#./mysqldump -u root -p'123456' samp_db>samp.db.txt


输出文件的开头看起来象这样:
# MySQL Dump 6.0
#
# Host: localhost Database: samp_db
#---------------------------------------
# Server version 3.23.2-alpha-log
#
# Table structure for table 'absence'
#
CREATE TABLE absence(
student_id int(10) unsigned DEFAULT '0' NOT NULL,
date date DEFAULT '0000-00-00' NOT NULL,
PRIMARY KEY (student_id,date)
);
#
# Dumping data for table 'absence'
#
INSERT INTO absence VALUES (3,'1999-09-03');
INSERT INTO absence VALUES (5,'1999-09-03');
INSERT INTO absence VALUES (10,'1999-09-08');
...... 
文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。

输出单个的表:
#mysqldump samp_db student score event absence >grapbook.sql
#mysqldump samp_db member president >hist-league.sql

缺省地,mysqldump在写入前将一个表的整个内容读进内存。这通常确实不必要,并且实际上如果你有一个大
表,几乎是失败的。你可用--quick选项告诉mysqldump只要它检索出一行就写出每一行。为了进一步优化倾
倒过程,使用--opt而不是--quick。--opt选项打开其它选项,加速数据的倾倒和把它们读回。


二、使用直接拷贝数据库的备份和拷贝方法
另一种不涉及mysqldump备份数据库和表的方式是直接拷贝数据库表文件。典型地,这用诸如cp、tar或cpio
实用程序。本文的例子使用cp。
%cd DATADIR


%cp -r samp_db /usr/archive/mysql
单个表可以如下备份:

%cd DATADIR/samp_db
%cp member.* /usr/archive/mysql/samp_db
%cp score.* /usr/archive/mysql/samp_db
....
当你完成了备份时,你可以重启服务器(如果关闭了它)或释放加在表上的锁定(如果你让服务器运行)。
要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上,只是将文件拷贝到另一台服务器主机的适
当数据目录下即可。要确保文件是MyIASM格式或两台机器有相同的硬件结构,否则你的数据库在另一台主机
上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。

建一个sh文件bakmysql.sh
#!/bin/sh
cd /usr/local/mysql/
tar cvf /mount2/mysqlvar.tar var

可以设到操作系统自动运行。
root用户crontab文件
/var/spool/cron/crontabs/root增加以下内容

0 2 1 * * /mount2/bakmysql.sh

#/etc/rc2.d/S75cron stop
#/etc/rc2.d/S75cron start
重新击活Sun Solaris自动处理进程

三、用备份恢复数据


数据库损坏的发生有很多原因,程度也不同。如果你走运,你可能仅损坏一两个表(如掉电),如果你倒霉
,你可能必须替换整个数据目录(如磁盘损坏)。在某些情况下也需要恢复,比如用户错误地删除了数据库
或表。不管这些倒霉事件的原因,你将需要实施某种恢复。

如果表损坏但没丢失,尝试用myisamchk或isamchk修复它们,如果这样的损坏可有修复程序修复。

1、 恢复整个数据库
Mysqldump参数如下:
#mysqldump -u 用户名-p'密码' 数据库名 <
操作系统下文件名

举例:
先在Mysql里创建另一个数据库
mysql> create database test;
然后将备份的数据导入
#mysqldump -u root -p'123456' test2 < samp.db.txt

marc...@gmail.com

unread,
Aug 22, 2005, 9:38:25 PM8/22/05
to Marco Lu's Group
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能

marc...@gmail.com

unread,
Aug 22, 2005, 9:39:07 PM8/22/05
to Marco Lu's Group
MYSQL创建、删除和选择数据库

MySQL提供了三条数据库级的语句,它们分别是:
CREATE DATABASE 用于创建数据库,DROP DATABASE
用于删除数据库,USE 用于选择缺省数据库。
1. CREATE DATABASE 语句
创建一个数据库很容易;只要在CREATE DATABASE
语句中给出其名称即可:


其中限制条件是该数据库的名称必须是合法的,该数据库必须不存在,并且您必须有足够的权限来创建它。
2. DROP DATABASE 语句

删除数据库就像创建它一样容易,假如有权限,执行下列语句即可:

请注意,不要乱用DROP DATABASE
语句,它将会删除数据库及其所有的表。在删除了一个数据库后,该数据库就永远没有了。换句话说,不要仅为了看看这条语句如何工作就试着执行该语句。如果管理员已经正常完成了数据库备份,那么删除的数据库可能还可以恢复。
请注意,数据库是由数据目录中的一个目录表示的。如果在该目录中放置了一些非表的数据文件,它们是不会被DROP
DATABASE
语句删除的。此时,该数据库目录自身也不被删除。
3. USE 语句
USE
语句选择一个数据库,使其成为服务器的给定连接的缺省(当前)数据库:


必须对数据库具有某种访问权限,否则不能使用它。为了使用数据库中的表而选择该数据库实际上不是必须的,因为可以利用db_name.tbl_name
形式来引用它的表。但是,不必指定数据库限定词引用表要方便得多。选择一个缺省数据库并不代表在连接的持续时间内它都必须是缺省的。可发布任意数目的USE
语句在数据库之间进行任意地切换,只要具有使用它们的权限即可。选择一个数据库也不限制您只使用该数据库中的表。您仍然可以通过用数据库名限定表名的方法,引用其他数据库中的表。

在服务器的连接终止时,服务器关于缺省数据库的所有记忆都消失了。即,如果您再次连接到该服务器,它不会记住以前您所选择的数据库。事实上,假定MySQL是多线程的,可通过一个用户处理多个连接,用户可以按任何顺序连接或断开,让服务器对缺省数据库进行记忆的想法也是没有意义的。在这个环境中,“以前选择的数据库”这句话指什么并不清楚。

Reply all
Reply to author
Forward
0 new messages