技术开发 频道

浅析MySQL数据库常用管理

 

【IT168 开源数据库】好久没有整理东西,感觉自己越来越懒,正好近期有个MYSQL的项目(一个ORACLE的应用迁移到MYSQL),以前没有接触过MYSQL,但是也知道MYSQL数据库目前广泛的应用在各种个人、商务系统中,各种技术都比较成熟。把自己学习的一些过程总结一下。 

    我们在前面已经简单介绍了一些MYSQL数据库的基本操作,这一章我们将针对MYSQL数据库管理员详细介绍下MYSQL数据库的常用管理内容。 



    MYSQL的管理工具很多,我自己从网上下载了一个。mysql-gui-tools-noinstall-5.0-r12-win32,是一个不用安装的管理软件,包含四个基本工具: 

    •MySQLAdministrator 
    •MySQLMigrationTool 
    •MySQLQueryBrowser 
    •MySQLSystemTrayMonitor 

    这些工具的具体使用都很简单,操作比较灵活,这里就不对这些工具的功能做详细介绍了,如果有兴趣大家可以自己下载下来,多使用几次就熟悉了。 

    1 MYSQL命令行管理工具 

    (1) 首先介绍几个MYSQL命令行工具: 

    mysqld_safe、mysql.server和mysqld_multi是服务器启动脚本。 

    注意:在Windows中不使用服务器启动脚本,我们可以使用WINDOWS命令来 
    
    启动MYSQL服务: 
    net start mysql 

    停止MYSQL服务: 
    net stop mysql 
    
    或者:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p shutdown
Enter password: ****** 

    注:mysqld是MySQL服务器。 

    下面的表格列举了几种WINDOS平台支持的MYSQL服务器:


    WINDOWS下执行二进制安装后,在WINDOWS服务中默认的就是使用的mysqld-nt服务器。 

    这个命令的使用我们将在后边的MYSQL服务器中详细讲解。 

    mysql_install_db初始化数据目录和初始数据库。 

    mysql是一个命令行客户程序,用于交互式或以批处理模式执行SQL语句, 

    这个命令我们在前边的例子中已经有很多应用了,这里就不多讲述了。我们给出一个例子:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -u root -p -e "SELECT * FROM
TEST limit
5;select * from test where id=1000" mytest Enter password: ****** +------+------+---------------------+---------------------+ | ID | MC | DT | RQ | +------+------+---------------------+---------------------+ | 1000 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 999 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 998 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 997 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 996 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +------+------+---------------------+---------------------+ +------+------+---------------------+---------------------+ | ID | MC | DT | RQ | +------+------+---------------------+---------------------+ | 1000 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 1000 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | | 1000 | test | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +------+------+---------------------+---------------------+

    mysqladmin是用于管理功能的客户程序。 

    我们可以通过mysqladmin –help来获得相关的信息,mysqladmin可以完成数据库的创建删除,修改用户密码,检查服务器状态,刷新系统变量等很多管理功能:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p ping Enter password: ****** mysqld is alive
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p status Enter password: ****** Uptime: 17842 Threads: 2 Questions: 12 Slow queries: 0 Opens: 13 Flush tabl es: 1 Open tables: 1 Queries per second avg: 0.001
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p version Enter password: ****** mysqladmin Ver 8.41 Distrib 5.0.27, for Win32 on ia32 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version 5.0.27-community-nt Protocol version 10 Connection localhost via TCP/IP TCP port 3306 Uptime: 4 hours 58 min 21 sec Threads: 2 Questions: 13 Slow queries: 0 Opens: 13 Flush tables: 1 Open tab les: 1 Queries per second avg: 0.001

    该命令我们将在MYSQL数据库用户管理、备份恢复中涉及到它的一些其他基本功能。 

    mysqlcheck执行表维护操作:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlcheck -uroot -p mytest Enter password: ****** mytest.aaa OK mytest.customer OK mytest.mytable OK mytest.sys_tests OK mytest.test OK mytest.test1 OK mytest.test_isam OK

    mysqldump数据库备份 
    mysqlhotcopy数据库备份 
    mysqlimport导入数据文件 

    这几个命令工具我们将在后边的备份恢复中详细讲解。 

    mysqlshow显示信息数据库和表的相关信息。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlshow -uroot -p mytest Enter password: ****** Database: mytest +-----------+ | Tables | +-----------+ | aa | | aaa | | customer | | mytable | | sys_tests | | test | | test1 | | test_isam | +-----------+

    以下是几个可以独立于MYSQL服务器(客户端可以执行)进行操作的工作。 

    myisamchk执行表维护操作。 
    myisampack产生压缩、只读的表。 
    mysqlbinlog是处理二进制日志文件的实用工具。 

    在MySQL中binlog的作用和Oracle中的归档日志类似, Oracle中提供了DBMS_LOGMNR来对日志文件进行分析, 来解出Redo SQL和Undo SQL, MySQL中也提供了一个名为mysqlbinlog的工具, 用来解释或取出存放在binlog中的SQL语句, 有没有Undo SQL我到是没有研究过. 最基本的使用语法如下:

mysqlbinlog [options] log_file ...

    在选项中, 可以指定一些过滤条件, 来解出你所想用的东西, 这样的选项有: 

--database=db_name, -d db_name --offset=N, -o N --[start|stop]-datetime=datetime --[start|stop]-position=N

    解出来的就是一条一条SQL语句了, 将这些语句执行一下, 就等于增量恢复了, 估计不是用绑定变量的, 可能在MySQL中是不是绑定变量不是很重要了。 然重要的一点是不要运行多个进程去跑, 因为这样的话, 顺序就得不到保证了。如下所示: 

$ mysqlbinlog binlog.000001 > /tmp/statements.sql $ mysqlbinlog binlog.000002 >> /tmp/statements.sql $ mysql -e "source /tmp/statements.sql"

    Oracle的LogMiner不太爽是因为它不是离线的, 做成MySQL这样的倒是比较方便多了. 看到这儿也应当可以想象到, MySQL中的复制大约是什么回事了吧?

    Mysqldumpslow 

    MySQL自带slow log的分析工具mysqldumpslow,但是没有说明。本文通过分析该脚本,介绍了其用法。slow log是MySQL根据SQL语句的执行时间设定,写入的一个文件,用于分析执行较慢的语句。 

    只要在 my.ini 文件中配置好: 

log-slow-queries = [slow_query_log_filename]

    即可记录超过默认的 10s 执行时间的 SQL 语句。 
    如果要修改默认设置,可以添加: 

long_query_time = 5

    设定为 5s 。 

    如果要记录所有 SQL 语句,可以写入: 

log-long-format # t=time, l=lock time, r=rows

    # at, al, 以及 ar 是对应的平均值 

    mysqldumpslow 可以接受的参数有: 

'v+', # verbose 'd+', # debug 's=s', # 排序 (t, at, l, al, r, ar etc) 'r!', # 倒排序 (largest last instead of first) 't=i', # 显示最高的 n 个查询 'a!', # 不把所有的数字以 N ,字符串以 'S' 显示 'n=i', # abstract numbers with at least n digits within names 'g=s', # grep: only consider stmts that include this string 'h=s', # hostname of db server for *-slow.log filename (can be wildcard) 'i=s', # name of server instance (if using mysql.server startup script) 'l!', # don't subtract lock time from total time

    perror显示错误代码的含义。 

    我们这里对MYSQL的命令做了个简单介绍,如果要看更多内容,几乎所有MYSQL命令我们都可以用—help来获得帮助,另外我们可以从MYSQL联机文档中获得更多信息。 

(2) 使用选项文件 

    MySQL程序可以从选项文件(有时也称为配置文件)读取启动选项。选项文件提供了一种很方便的方式来指定常用的选项,因此不需要每次运行程序时从命令行输入。 

    下面的程序支持选项文件:myisamchk、myisampack、mysql、mysql.server、mysqladmin、mysqlbinlog、mysqlcc、mysqlcheck、mysqld_safe、mysqldump、mysqld、mysqlhotcopy、mysqlimport和mysqlshow。我们在前边讲述创建用户数据库的时候已经提到过修改MYSQL的配置文件来修改数据文件的路径:配置文件”my.cnf”或”my.ini”(WINDOWS系统) 

    注:在Unix平台上,MySQL忽略人人可写的配置文件。这是故意的,是一个安全措施。这句话是在查阅资料时看到的,未加验证。

(3)用环境变量指定选项

C:\Program Files\MySQL\MySQL Server 5.0\bin>set user=TEST C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -p mytest Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 5.0.27-community-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> select user(); +----------------+ | user() | +----------------+ | TEST@localhost | +----------------+ 1 row in set (0.06 sec)
(4)使用选项设置程序变量
shell> mysql --max_allowed_packet= 2097152 shell> mysql --max_allowed_packet=2M
2. MYSQL实例管理器mysqlmanager 

    该工具软件在WINDOWS平台需要单独下载: 

    该软件官方网站:http://www.sqlmanager.net/products/mysql/manager 

    关于MYSQL实例管理器我们暂时不做太多研究。

3. MySQL服务器管理 

    WINDOWS下执行二进制安装后WINDOWS服务中默认的调用的是mysqld-nt服务器,我们可以在WINDOWS的MySql服务的属性中看到: 

    "C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt" --defaults-file
="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" MySQL 

    我们也可以不用WINDOWS的默认MYSQL服务器,而启用mysqld服务器来
启动MYSQL:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqld --console 070608 14:12:04 [Warning] Changed limits: max_open_files: 2048 max_connections: 800 table_cache: 619 070608 14:12:05 InnoDB: Started; log sequence number 0 956199 070608 14:12:05 [Note] mysqld: ready for connections. Version: '5.0.27-community' socket: '' port: 3306 MySQL Community Edition (GPL)

    如果省略--console选项,服务器向数据目录(默认为C:\Program Files\MySQL \MySQL Server 5.1\data)中的错误日志写入诊断输出。错误日志文件的扩展名为.err。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqld
--defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" 070608 9:32:34 [Warning] Changed limits: max_open_files:
2048 max_connections: 800 table_cache: 619

    如果我们没有执行环境变量和程序变量,mysqld和mysqld-nt都是从配置文件中的[mysqld]和[server]组读取选项。 

    我们可以执行以下命令来获得MYSQL数据库服务器系统变量:

C:\Program Files\MySQL\MySQL Server 5.0\bin> mysqld --verbose –help

    在MYSQL数据库中查看实际使用的服务器系统变量:

mysql> SHOW VARIABLES; mysql> SHOW VARIABLES LIKE 'key_buffer_size'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | key_buffer_size | 32505856 | +-----------------+----------+ 1 row in set (0.06 sec) mysql> show variables like 'sort_buffer%'; +------------------+----------+ | Variable_name | Value | +------------------+----------+ | sort_buffer_size | 10485760 | +------------------+----------+ 1 row in set (0.09 sec) mysql> SET sort_buffer_size = 5 * 1024 * 1024; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'sort_buffer%'; +------------------+---------+ | Variable_name | Value | +------------------+---------+ | sort_buffer_size | 5242880 | +------------------+---------+ 1 row in set (0.00 sec)

    通过以下命令后的运行的数据库服务器的统计和状态指标:

mysql> SHOW STATUS; +-----------------------------------+-----------+ | Variable_name | Value | +-----------------------------------+-----------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Binlog_cache_disk_use | 0 | | Binlog_cache_use | 0 | | Bytes_received | 144 | | Bytes_sent | 13078 |

    MYSQL服务器的系统变量和状态变量很多,我们这里不做太多解释,在以后的优化等章节中我们将会详细讲述一些我们常用的变量及调整。 

    停止MYSQL:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p shutdown Enter password: ******

    4 MYSQL用户管理 

    (1) 创建数据库用户

mysql> create user 'zhouwf'@'localhost' identified by 'zhouwf'; Query OK, 0 rows affected (0.00 sec) mysql> create user 'zhouwf'@'%' identified by 'zhouwf'; Query OK, 0 rows affected (0.00 sec)


    (2) 给用户授权

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON mytest.* TO 'zhouwf'@'localhost'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON mytest.* TO 'zhouwf'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

    (3) 删除用户

mysql> drop user 'zhouwf'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> drop user 'zhouwf'@'%'; Query OK, 0 rows affected (0.00 sec)

    (4) 修改用户密码 

    A、利用mysqladmin工具

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uTEST -p password TTTT Enter password: **** C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uTEST -pTTTT mytest Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 68 to server version: 5.0.27-community-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    B、使用MYSQL数据库命令SET:

mysql> SET PASSWORD FOR 'TEST'@'LOCALHOST' = PASSWORD('TEST'); Query OK, 0 rows affected (0.00 sec)

    C、使用MYSQL数据库命令GRANT IDENTIFIED BY:

mysql> grant usage on mytest.* to 'TEST'@'LOCALHOST' identified by 'TTTT'; Query OK, 0 rows affected (0.00 sec)

    当然我们还可以利用REPLACE命令修改mysql.user表的内容的方式来修改密码,我们不建议这么做,这里也就不给出例子了。

    5 MYSQL权限管理 

    MySQL存取控制包含2个阶段。 

    阶段1:服务器检查是否允许你连接。 

    阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限
实施它。例如,如果你从数据库表中选择(select)行或从数据库删除表,服务器确定你对表有SELECT权限或对数据库有DROP权限。 

    在这里我们不对MYSQL的各个权限做详细的解释,我们在使用的时候可以从MYSQL联机文档中获得更多的详细信息。

    6 MYSQL备份与恢复 

    mysqlhotcopy 

    其命令格式如下:

shell> mysqlhotcopy db_name /path/to/some/dir

    只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。

mysqldump 

    mysqldump提供在线逻辑备份,我们在备份的时候使用single-transaction参数的话,MYSQL为我们提供一致性地读,并且保证mysqldump所看见的数据不会更改。(其它客户端对InnoDB表进行的更改不会被mysqldump进程看见)该参数自动关闭--lock-tables。如果我们还有其它类型的表,我们必须假定在备份过程中它们不会更改。例如,对于mysql数据库中的MyISAM表,我们必须假定在备份过程中没有对MySQL账户进行管理更改。mysqldump命令产生的.sql文件包含一系列SQL INSERT语句,可以用来重载转储的表。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p mytest >mytest.sql Enter password: ******

     生成的mytest.sql文件的示例内容如下:

-- MySQL dump 10.10 -- -- Host: localhost Database: mytest -- ------------------------------------------------------ -- Server version 5.0.27-community-nt /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `aaa` -- DROP TABLE IF EXISTS `aaa`; CREATE TABLE `aaa` ( `id` decimal(18,2) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Dumping data for table `aaa` -- LOCK TABLES `aaa` WRITE; /*!40000 ALTER TABLE `aaa` DISABLE KEYS */; INSERT INTO `aaa` VALUES ('3000.00'); /*!40000 ALTER TABLE `aaa` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `customer` -- DROP TABLE IF EXISTS `customer`; CREATE TABLE `customer` ( `A` int(11) default NULL, `B` char(20) default NULL, KEY `A` (`A`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; …… LOCK TABLES `test_isam` WRITE; /*!40000 ALTER TABLE `test_isam` DISABLE KEYS */; INSERT INTO `test_isam` VALUES (999013,'test'),(999014,'test'),(999015,'test'),(999016,'test'),(999017,'test'),(999018,'test'),(999019,'test'),(999020,'test') ,(999265,'test'),(999266,'test') ……

    mysqldump增量备份 

    要想进行增量备份,我们需要保存增量更改。应使用--log-bin选项启动MySQL服务器,以便更新数据时将这些更改保存到文件中。该选项启用二进制日志,因此服务器写将每个更新数据的SQL语句写入MySQL二进制日志。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" --log-bin 070609 17:58:42 [Warning] Changed limits: max_open_files: 2048 max_connections: 800 table_cache: 619

    我们可以在basedir找到以下MySQL二进制日志文件:

mochasof-8ed6b1-bin.000001 mochasof-8ed6b1-bin.000002 mochasof-8ed6b1-bin.000003

    每次重启,MySQL服务器用序列中的下一个编号创建一个新的二进制日志文件。当服务器运行时,我们还可以通过执行FLUSH LOGS语句或mysqladmin flush-logs命令,告诉服务器关闭当前的二进制日志文件并创建一个新文件。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p flush-logs Enter password: ******

    该命令类似于ORACLE的alter system switch logfile命令(日志切换)。mysqldump也有一个选项来清空日志。数据目录中的.index文件包含该目录下所有MySQL二进制日志的清单。该文件用于复制。 

    恢复时MySQL二进制日志很重要,因为它们是增量备份。如果进行完全备份时确保清空了日志,则后面创建的二进制日志文件包含了备份后的所有数据更改。让我们稍稍修改前面的mysqldump命令,让它在完全备份时能够清空 MySQL二进制日志,以便转储文件包含包含新的当前的二进制日志,我们在basedir下看到MYSQL产生的最新的日志文件mochasof-8ed6b1-bin.000004:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases> backup_all.sql Enter password: ******

    Backup.sql文件包含下列行:

-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mochasof-8ed6b1-bin.000004', MASTER_LOG_POS=98; -- -- Current Database: `mysql` -- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `mysql`;

    --master-data参数: 

    这个参数把二进制日志的位置和文件名写入备份文件中,如果该值等于1,在备份文件中将会打印一个CHANGE MASTER命令;如果该值等于2,在备份文件中将会给出一个包括CHANGE MASTER的注释,这个操作将会打开--lock-all-tables选项开关,除非和我们前边提到过的--single-transaction参数选项一起结合使用,这时--single-transaction优先级高于master-data,在备份期间人户引起日志改变的操作都自动将--lock-tables关闭。以下是从MYSQL的help中获得的信息。 

    --master-data[=#] This causes the binary log position and filename to be appended to the output. If equal to 1, will print it as a CHANGE MASTER command; if equal to 2, that command will be prefixed with a comment symbol. This option will turn --lock-all-tables on, unless --single-transaction is specified too (in which case a global read lock is only taken a short time at the beginning of the dump - don't forget to read about --single-transaction below). In all cases any action on logs will happen at the exact moment of the dump.Option automatically turns --lock-tables off. 

    因为mysqldump命令可以执行完全备份,这些行表示两件事情: 

    A、backup.sql文件包含所有写入mochasof-8ed6b1-bin.000004二进制日志文
件或最新的文件之前的更改。 

    B、备份后所记录的所有数据更改不出现在backup.sql中,但出现在mochasof-8ed6b1-bin.000004二进制日志文件或最新的文件中。 

    接下来我们可以清空日志开始新的二进制日志文件来创建增量备份。例如,执行mysqladmin flush-logs命令创建mochasof-8ed6b1-bin.000005。完全备份之后所有更改为文件mochasof-8ed6b1-bin.000004。该增量备份很重要,因此最好将它复制到安全的地方。(例如,备份到磁带或DVD上,或复制到另一台机器上)。以后我们执行另一个mysqladmin flush-logs命令创建mochasof-8ed6b1-bin.000006,mochasof-8ed6b1-bin.000005也应复制到某个安全的地方。 

    MySQL二进制日志占据硬盘空间。要想释放空间,应随时清空。操作方法是删掉不再使用的二进制日志,例如进行完全备份时: 

    C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --delete-master-logs mytest > mytest_new.sql
Enter password: ****** 

    注释:如果你的服务器为复制主服务器,用mysqldump --delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。
PURGE MASTER LOGS语句的描述中解释了为什么在删掉MySQL二进制日志之前应进行确认。

    一个简单的恢复测试 

    做全库备份:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p
--single-transaction --flush-logs --master-data=2 mytest > backup_mytest.sql Enter password: ******

    备份后创建新的测试表并INSERT测试数据:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uTEST -p mytest Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 to server version: 5.0.27-community-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW TABLES; +------------------+ | Tables_in_mytest | +------------------+ | aaa | | customer | | mytable | | sys_tests | | test | | test1 | | test_isam | +------------------+ 7 rows in set (0.00 sec) mysql> CREATE TABLE NEW_TABLE(ID VARCHAR(20),MC VARCHAR(60)); Query OK, 0 rows affected (0.28 sec) mysql> INSERT INTO NEW_TABLE VALUES('1','111'); Query OK, 1 row affected (0.23 sec) mysql> SELECT * FROM NEW_TABLE; +------+------+ | ID | MC | +------+------+ | 1 | 111 | +------+------+ 1 row in set (0.00 sec) mysql> FLUSH LOGS; Query OK, 0 rows affected (0.53 sec)

    删除所有TABLE后:

mysql> SHOW TABLES; Empty set (0.00 sec)

    我们从全库备份文件执行恢复操作:

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uroot -p mytest < backup_mytest.sql Enter password: ****** C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uTEST -p mytest Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 to server version: 5.0.27-community-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW TABLES; +------------------+ | Tables_in_mytest | +------------------+ | aaa | | customer | | mytable | | sys_tests | | test | | test1 | | test_isam | +------------------+ 7 rows in set (0.01 sec)

    这时我们发现新创建的测试表丢失,我们将应用增量备份来恢复最新数据。

C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog -uroot -p
E:\MySqlData\mochasof
-8ed6b1-bin.000003 | mysql -uTEST -p mytest Enter password: Enter password: ****** **** C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uTEST -p mytest Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 24 to server version: 5.0.27-community-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SHOW TABLES; +------------------+ | Tables_in_mytest | +------------------+ | aaa | | customer | | mytable | | new_table | | sys_tests | | test | | test1 | | test_isam | +------------------+ 8 rows in set (0.02 sec) mysql> SELECT * FROM NEW_TABLE; +------+------+ | ID | MC | +------+------+ | 1 | 111 | +------+------+ 1 row in set (0.00 sec)

    至此新创建的表NEW_TABLE恢复完成。MYSQL还支持基于时间点的恢复及设置自动恢复等,我们在这里不做太多讲述。

    7 MYSQL日志文件管理 

    MYSQL有以下几种日志文件:

    (1)错误日志 

    可以用--log-error[=file_name]选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err 并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。 

    (2)通用查询日志 

    如果你想要知道mysqld内部发生了什么,你应该用--log[=file_name]或-l [file_name]选项启动它。如果没有给定file_name的值, 默认名是host_name.log。所有连接和语句被记录到日志文件。当你怀疑在客户端发生了错误并想确切地知道该客户端发送给mysqld的语句时,该日志可能非常有用。 

    mysqld按照它接收的顺序记录语句到查询日志。这可能与执行的顺序不同。这与更新日志和二进制日志不同,它们在查询执行后,但是任何一个锁释放之前记录日志。(查询日志还包含所有语句,而二进制日志不包含只查询数据的语句)。
服务器重新启动和日志刷新不会产生新的一般查询日志文件(尽管刷新关闭并重新打开一般查询日志文件)。在Unix中,你可以通过下面的命令重新命名文件并创建一个新文件: 

    shell> mv hostname.log hostname-old.log 
    shell> mysqladmin flush-logs 
    shell> cp hostname-old.log to-backup-directory 
    shell> rm hostname-old.log 

    在Windows中,服务器打开日志文件期间你不能重新命名日志文件。你必须先停止服务器然后重新命名日志文件。然后,重启服务器来创建新的日志文件。 

    (3)二进制日志 

    二进制日志我们在前边的备份和恢复中已经讲述过,这里不再赘述。更多信息参看MYSQL文档。 

    (4)慢速查询日志 

    用--log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。获得初使表锁定的时间不算作执行时间。 

    如果没有给出file_name值, 默认未主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。 

    语句执行完并且所有锁释放后记入慢查询日志。记录顺序可以与执行顺序不相同。 

    慢查询日志可以用来找到执行时间长的查询,可以用于优化。但是,检查又长又慢的查询日志会很困难。要想容易些,你可以使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志。 

    在MySQL 5.1的慢查询日志中,不使用索引的慢查询同使用索引的查询一样记录。要想防止不使用索引的慢查询记入慢查询日志,使用--log-short-format选项。 

    在MySQL 5.1中,通过--log-slow-admin-statements服务器选项,你可以请求将慢管理语句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE写入慢查询日志。 

    用查询缓存处理的查询不加到慢查询日志中,因为表有零行或一行而不能从索引中受益的查询也不写入慢查询日志。




0
相关文章