《MySQL技术》学习笔记——MySQL的基本管理

MySQL的基本管理

管理网站的MySQL时,为保证MySQL的平稳运行而需履行的各项职责。

  • 在MySQL安装完成后加强安全设置
  • 确保服务器可长时间正常运行
  • 监视和设置服务器运行参数
  • 选择插件,启用服务器功能
  • 维护服务器日志
  • 调整服务器,获得更好性能
  • 分析底层硬件,解决物理约束
  • 运行多个服务器
  • 确定是否需将MySQL升到较新版本

几个应用程序。

  • mysqld-MySQL服务器。
  • 服务器启动程序 mysqld_safe、mysqld.server、mysqld_multi 。
  • 管理工具 mysqladmin 。

MySQL的数据目录里存储者MySQL服务器的数据库,日志文件和其他信息。

保护新安装的MySQL

MySQL的安装过程会在服务器的数据目录里生成两个数据库。

  • 数据库mysql。
    包含了用于控制客户端对服务器进行访问的各种权限表。
  • 数据库test。
    可用于测试。

为初始的MySQL账户建立密码

以下假设你在名为cobra.example.com的机器上运行MySQL服务器,并从这台机器连接该服务器。

假设你已经启动了MySQL服务器。
MySQL安装过程会在mysql数据库的权限表里设置以下两种账户。

  • 用户名为root的账户。
    root账户拥有全部的权限,可删除所有数据库和关闭服务器。
  • 用户名为空白的账户。
    为匿名账户,权限较少。

MySQL服务器上已有的账户全部列在mysql数据库的user表里,因此你可在那里找到那些初始账户。
默认下,这些账户没有密码。
应为root用户设置密码。

数据目录里的权限表源自何处?

  • Unix下,mysql_install_db 脚本会在安装过程中完成数据目录的初始化工作。
    mysql_install_db脚本的其中一个目标便是在mysql数据库里建立权限表。
  • 在Windows 系统里,数据目录和 mysql 数据库都被包含在预先初始化好的MySQL发行包里。

所有平台上,大部分初始账户相同。

主机用户超级用户权限
localhostroot全部
127.0.0.1root全部
::1root全部
localhost

在Unix下,通过运行mysql_install_db来初始化权限表,会得到两个与主机特定相关的账户:
一个是root,一个是匿名用户。

1.以root连接到服务器
2.显示为某主机上某用户设置登录密码

>SET PASSWORD FOR 'root'@'localhost' = PASSWORD('rootpass');

也可用UPDATE语句更新mysql.user表来完成。

>UPDATE mysql.user SET Password=PASSWORD('rootpass') WHERE User='root';
>FLUSH PRIVILEGES;

一般应删除匿名账户。

>DROP USER ' '@'localhost';

为附加服务器设置密码

启动时加–skip-password可略过密码验证。

% mysql -u root --skip-password

安排MySQL服务器的启动和关闭

在Unix里运行MySQL服务器

在Unix里,MySQL服务器可通过命令行手动启动。
也可将其作为标准启动过程的一部分在操作系统启动时自动运行。

在Unix里,MySQL服务器的启动过程要实现以下两个目标。

  • 应该以root以外的其他用户身份来运行服务器。
    如以root身份启动服务器,应告知它在启动过程中更改自己的用户ID,以一个无特权的用户身份运行。
  • 每次都应以同一个用户身份来运行服务器。

用无特权的登录账户运行服务器

  • 不会有人将服务器作为一个安全漏洞来利用,以获得 root 访问权限。
  • 服务器创建的文件都属于root以外的另一个无特权账户。
  • 当用root以外的无特权用户身份登录时,执行MySQL的管理任务会更安全。
  • 创建一个专门用于MySQL有关活动的账户,概念和管理上会更清晰,同时也更容易弄清系统里哪些内容是与MySQL有关的。

将mysqld设为以无特权的非root用户运行:

  • 停止正在运行的服务器
% mysqladmin -p -u root shutdown
  • 选择用于运行mysqld的登录账户。
    可指定一个专用于MySQL的组名。
  • 如有必要,可用系统的常规账户创建步骤来为你选择的那个用户名创建登录账户。
    此时,需以root身份完成此项工作。
  • 修改MySQL数据目录及其下面所有子目录和文件的用户和组的所有权,让它们归mysql用户所用。
    如果数据目录为/usr/local/mysql/data。用户,用户组均为mysql。
# chown -R mysql /usr/local/mysql/data
# chgrp -R mysql /usr/local/mysql/data
  • 一种很好的安全预防措施是:将数据目录的访问模式设为其他人都不可访问。
# chmod -R go-rwx /usr/local/mysql/data

在启动服务器时带上–user=mysql(设用户为mysql),这样以root身份来调用时,会将root切换为mysql来运行。
也可在选项文件中指定。

[mysqld]
user=mysql

如果以非root身份启动服务器,遇到上述会警告(非root不可在运行时更改进程的有效用户ID)。

在Unix里启动服务器

决定使用哪个登录账户来运行MySQL后,如何启动服务器。

  • 直接调mysqld。
    可找出支持的启动选项:
% mysql --verbose --help
  • 调用mysqld_safe脚本。
    mysqld_safe脚本会调服务器,监视它;在服务器意外中断时,会重启它。
    在非BSD风格的Unix版本里,也可通过mysql.server来调用它。
    mysqld_safe脚本会将服务器的出错信息和其他诊断输出内容重定向到数据目录下的某个文件,产生一个出错日志;或重定向到syslog,如将错误输出发给文件,则mysqld_safe脚本会设置该文件的所有权,使其归–user选项指定的那个登录账户所有。
    当mysqld_safe试图写入出错日志文件时,会因权限不足而失败。
    你想通过检查出错日志来弄清问题在哪时,无法找出导致问题原因的信息。

  • 调用mysql.server脚本。
    该脚本会通过执行mysqld_safe来启动服务器。
    调用时,可用参数start或stop来表明要启动还是停止。

  • 要想协调多个服务器,可用mysqld_multi脚本。
    会读取你在其中为多个服务器列出启动参数的那个选项文件。
    有了它,你便可对每一个服务器的启动或停止进行控制,或检查它是否在运行。

系统开机时,启动服务。

对BSD风格的系统,在/etc目录常会有几个启动时初始化服务的文件。
通常以rc为开头,并且有可能有一个名为rc.local或类似的文件,专门用于启动本地安装的各种服务。
在基于rc的系统里,可把下面几行添加到rc.local来启动服务器。

if[-x /usr/local/bin/mysqld_safe]; then
	/usr/local/bin/mysqld_safe&
fi

对System V风格的系统,可安装mysql.server。(将它复制到位于/etc下的运行级目录里)。
如果运行的是linux系统,且通过RPM包来安装的,到此结束。否则,还需在启动脚本主目录安装此脚本,将对它的链接放到相应的运行级目录里。

许多Linux的变体在/etc/init.d和/etc/rc.d下都有一个目录集。
这类Linux通常有一个用于启动脚本管理的chkconfig 命令。
下面展示如何将mysql.server以mysql名字安装到启动目录里。

  • (1)把mysql.server从当前位置复制到init.d目录
    使其可执行:
# cp mysql.server /etc/init.d/mysql
# chmod +x /etc/init.d/mysql
  • (2)注册脚本,并启用它:
# chkconfig --add mysql
# chkconfig mysql on
  • (3)验证该脚本是否已启用。
#chkconfig --list mysql

如果没chkconfig,可以使用手动过程。

# cp mysql.server /etc/init.d/mysql
# cd /etc/init.d
# chmod +x mysql
# cd /etc/rc.d/rc3.d
# ln -s /etc/init.d/mysql s99mysql

指定服务器启动选项

在任何一个平台里,都有两种主要的指定启动选项的方法,用于调用 MySQL服务器。

  • 在命令行上列出各个选项。
  • 将选项列在选项文件里。

获取选项文件位置:
% mysqld --verbose --help

通常,MySQL服务器启动选项都在[mysqld]选项组里。

MySQL服务器程序使用的选项组。

程序程序使用的选项组
mysqld[mysqld]、 [server]
mysqld_safe[mysqld] 、[server]、 [mysqld_safe]
mysql.server[mysqld] 、[server] 、[mysql_server] 、[mysql.server]

在往选项组里放选项时,要选择在你想要的上下文里会用到的选项组。

控制服务的连接监听

MySQL服务器可在多种网络接口上对连接监听。

  • 在所有平台里,服务器都可对基于IP地址和网络端口的TCP/IP连接进行监听。
    例如,启动时,使用–skip-networking,可跳过此监听。
    默认下监听服务器所在主机所有接口。
    要指定监听接口,可用 --bind-address=addr 选项来实现。
    • a.对0.0.0.0,表示在所有IPV4接口上接受连接
    • b.对::,会在所有IPV4和IPV6接口上接受连接
    • c.*与::很像
    • d.对IPV4映射地址
      例如,服务器绑定到::ffff:192.168.0.3时,允许客户端在进行连接时将–host选项值指定为::ffff:192.168.0.3或192.168.0.3 。
    • e.对其他的IPV4或IPV6。
      则指定唯一一个接口。
      默认端口号为3306。可用–port指定一个其他端口号。
  • 在Unix里,服务器会在Unix域套接字监听本机客户端。
    服务器使用的套接字文件不可被关闭。
    为显式指定套接字文件的路径名,可用–socket选项。

停止服务器

手动停止服务器。

% mysqladmin -p -u root shutdown

也可以mysql.server stop来停止。

当无法连接服务器时重新获得对它的控制

连接不上MySQL服务器下,对其重启。
若通过本地套接字文件建立的连接,套接字文件丢失了。
可改用tcp连接,登录时,用-h 指的本地IP即可,或在选项文件,指定另一套接字文件。

例如

[mysqld]
socket=/usr/local/mysql/mysql.sock

[client]
socker=/usr/local/mysql/mysql.sock

上述修改后,需重启MySQL服务器。
如果因不记得或不知道root密码而不能进行连接的,你得重新获得对服务器的控制。

  • (1)停止服务器.
    在Unix下,让其正常关闭

    # kill -TERM PID
    

    强制关闭

    #kill -9 PID 
    

    在Linux下,ps可能显示多个mysqld进程,它们实际上属于同一个进程的多个线程,只要终止其中任一个即可。
    如果用mysql_safe来启动MySQL服务器,它会监视服务器是否异常终止的。
    如果用kill -9来终止,mysql_safe会立即重启它。
    为此,应先终止mysql_safe,再终止mysqld。

  • (2)用–skip-grant-tables选项重启MySQL服务器。
    禁止用权限表对连接进行验证,以便进行连接时可不用密码,且拥有所有权限。
    连接上,应立即执行>FLUSH PRIVILEGES,以便MySQL服务器重新读取权限表,并再次把它们用于访问控制。
    FLUSH还会重新启用SET PASSWORD,重新载入权限表后,便可更改root的密码。

    SET PASSWORD FOR 'root'@'localhost'=PASSWORD('rootpass');
    
  • (3)更改root的密码后,需关闭MySQL服务器,并按正常的启动过程重启它。
    现在,可用新密码,以root身份登录了。

使用系统变量和状态变量

系统变量控制着MySQL服务器的运作参数。
用SHOW VARIABLES可显示这些变量。
如果默认值不合适,可更改它们。
有些系统变量适用于性能调整。
MySQL服务器还有一组状态变量,它们提供与MySQL服务器运行时的性能表现相关的信息。

查看和设置系统变量值

运行时,可用SHOW VARIABLES来显示系统变量。
在运行时所做的更改在MySQL服务器进程终止时会消失。
如果你确定了一个更适合的系统变量值,便可将其设置到某个选项文件中,以便让该值在MySQL服务器重启后可继续使用。

系统变量存在于两个层面上:全局层和特定于会话层。
全局变量会对整个服务器的运作产生影响。
特定与会话的变量只会对服务器如何处理某个给定的客户端连接或会话产生影响。
客户端可在其自己的会话里局部地改变这些变量。
对在两个层面都有值的变量,服务器会使用全局值来初始化会话变量。
在某个会话里,对全局变量的更改并不会影响到客户端相应会话变量的当前值。

一个系统变量可同时拥有全局值和会话值,只拥有一个全局值,或只拥有一个会话值。

  • sql_mode变量控制着SQL模式,并在诸多方面影响着对服务器SQL语句的处理。
    有全局值,会话值。
    拥用SUPER权限的客户端可在自己会话里更改全局sql_mode值。
    新的全局值会称为更改后连入的那些客户端的会话默认值。
  • innodb_buffer_pool_size只有全局值。
    控制着缓冲InnoDB表数据和索引的那个缓存的大小。
    这个缓存为所有的客户端共享。
  • error_count只有会话值。
    表示在可能生成错误的当前会话里,最后那条语句所产生的错误数。

查看系统变量值

>SHOW VARIABLES;
>SHOW VARIABLES LIKE '%buffer%';
>SHOW VARIABLES
>WHERE Variable_name LIKE '%timeout%' AND Value < 60;

默认下,SHOW VARIABLES会显示各个会话变量值
如想特定地显示全局变量或会话变量,可在语句中加上限定符GLOBAL或SESSION。

>SHOW GLOBAL VARIABLES;
>SHOW SESSION VARIABLES;

要查询单个变量值,可用 @@GLOBAL.var_name来查询全局变量,使用语法格式 @@SESSION.var_name或者 @@LOCAL.var_name 来查询会话变量。
如果使用不带限定符的@@var_name语法,则当限定符存在时,使用的是会话变量;否则,使用的是全局变量。
@@-语句具有通用性,可用在SET, SELECT或其他SQL语句里:

SELECT @@default_storage_engine AS 'Default storage engine';
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
WHERE VARIABLE_NAME LIKE '%binlog%';

在服务器启动时设置系统变量

可用命令行选项。

% mysqld --max_connections=200

可在选项文件里设置。

[mysqld]
max_connections=200

在服务器启动时,系统变量名称里的短划线和下划线可混合使用。

% mysqld --max-connections=200

对表示缓冲区大小或长度的变量,如果指定的数字没有后缀,其值的单位就是字节;
若后缀为’K’, ‘M’或’G’,则分别表示千字节,兆字节,吉字节。
如:

[mysqld]
max_connections=1K
innodb_buffer_pool_size=16M

有些系统变量无法在启动时设置,如time_zone,但可用–default-time-zone选项。

在运行时设置系统变量

在运行时设置系统变量的语法取决于是设置全局变量还是设置会话变量。
要设置名为var_name的全局变量,可用SET。
如:

SET GLOBAL var_name=value;
SET @@GLOBAL.var_name = value;
SET SESSION var_name=value;
SET @@SESSION.var_name=value;

如没有限定符,SET语句会修改会话变量。

SET var_name=value;
SET @@var_name=value;

在设置全局变量时,必须拥有SUPER权限。
该设置会一直持续到再次发生改变时或服务器退出时。
在设置会话变量,无需特殊权限。
该设置持续到再次发生改变,或当前会话终止。

可在一条SET设置多个变量,彼此用逗号隔开。

此时显式的GLOBAL或SESSION会应用到多个紧随其后的那些自身未包含限定符的变量设置。

SET GLOBAL v1=vall,v2=va12,SESSION v3=val3,v4=val4;

与启动时设置的变量不同,在运行时你不能把名字里的下划线替换为短划线,并且在指定其值时不能用后缀字母’K’,‘M’,‘G’ 。
你可用表达式,可在表达式里引用其他变量的值。

SET GLOBAL read_buffer_size=2*1024*1024
SET SESSION read_buffer_size=2*@@GLOBAL.read_buffer_size

系统变量可被设置为特殊的DEFAULT。

查看状态变量值

>SHOW STATUS;

状态变量只能由服务器来设置,因此它们对用户来说是只读的,且不能像系统变量那样用SET来修改。
与状态变量也有全局值和特定于会话的值,因此相关的语句也可用限定符GLOBAL或SESSION 。

SHOW GLOBAL STATUS
SHOW SESSION STATUS

如果某个变量只有全局值,则对GLOBAL和SESSION,你将得到相同的值。
与SHOW VARIABLES一样,将子句LIKE或WHERE与SHOW STATUS一起用,可对这些变量的输出进行限制,使它们的名字能与给定的SQL模式匹配,或满足通用的检索条件。
例如,想检查与InnoDB的日志活动相关联的那些状态变量的值,可用如下语句:

>SHOW GLOBAL STATUS LIKE 'innodb%log%';

查询INFORMATION_SCHEMA库的GLOBAL_STATUS表和SESSION_STATUS表,可获得状态变量的信息,且可在计算里使用这些值。
例如:

SET @queries=
	(SELECT VARIABLE_VALUE 
	FROM INFORMATION_SCHEMA.GLOBAL_STATUS
	WHERE VARIABLE_NAME LIKE 'Queries');
SET @uptime=
	(SELECT VARIABLE_VALUE
	FROM INFORMATION_SCHEMA.GLOBAL_STATUS
	WHERE VARIABLE_NAME LIKE 'Uptime');
SELECT @queries/@uptime/60 AS 'Queries per minute';

插件接口

MySQL服务器的架构支持"可插拔",以至于实现服务器某些功能的代码段,可单独编译,存储在外部文件里,根据需要加载。

在MySQL里,插件可实现的功能包括存储引擎、INFORMATION_SCHEMA库的各个表,全文搜索修饰符,复制机制,审计功能,身份认证方法等。

插件接口包含以下几个组成部分:

  • 插件文件
    服务器插件以目标文件方式存储。
  • 插件目录
    所有的插件文件都需安装在此位置。
    插件目录通常为MySQL安装目录下的lib/plugin,但可根据系统变量plugin_dir来确定。
    要使用不同的位置,可在服务器启动时设置plugin_dir。
  • 控制语言
    有了它,DBA便可指示加载那些插件。
    它利用服务器选项和SQL语句来处理插件。
    例如, --plugin-load 用于在服务器启动时加载插件,INSTALL PLUGIN用于在运行时加载插件。
  • 插件注册
    启动时,服务器会在mysql数据库里检查plugin表,并自动加载注册的插件。
    使用–skip-grant-tables选项可跳过这一操作。
    要在此表中注册插件,可用INSTALL PLUGIN。

假如有两个插件库对象文件,都安装在服务器的插件目录里:

  • 一个是名为my_engine.so的库,其中含一个插件,实现了一个名为MY_ENGINE的存储引擎。
  • 一个是名为info_tables.so的库,其中含多个插件。
    这些插件实现了INFORMATION_SCHEMA库的LOCKS表和USERS表,分别用于显示与当前锁和连接客户端有关的信息。

通过插件接口,可完成如下操作:

  • 服务器启动时,从文件里单独或成组地加载插件。
  • 运行时,单独加载或卸载插件。
  • 运行时,检查哪些插件可用。

要想在服务器启动时加载插件,可用选项–plugin-load或–plugin-load-add 。
这两个选项的值都是一个列表,由一个或多个分号分隔开的plugin_name=lib_name 或 lib_name说明符构成。
当同时列出插件名和库名时,服务器只会加载该库里的当只列出库名,没列出插件名时,服务器会加载该库里的所有插件。
如:

[mysqld]
plugin-load=my_engine.so;info_tables.so

如只想加载info_tables.so里的LOCKS插件,可用下面内容。

[mysqld]
plugin-load=locks=info_tables.so

插件名的大小写无关紧要。
–plugin-load-add与–plugin-load相似。
–plugin-load选项的每个实例会重置被加载插件的列表
–plugin-load-add不会。
如果多次指定–plugin-load,只有最后一个起作用。

在运行时加载插件,可用INSTALL PLUGIN。
此语句的每个实例都可指定一个插件和包含它的那个库对象文件。
如:

INSTALL PLUGIN my_engine SONAME 'my_engine.so';
INSTALL PLUGIN locks SONAME 'info_tables.so';
INSTALL PLUGIN users SONAME 'info_tables.so';

INSTALL PLUGIN不仅会加载插件,还会在 mysql.plugin表里注册它。
这样服务器在随后的重启中就可自动加载该插件。
可用UNINSTALL PLUGIN在运行时卸载插件。
如:

UNINSTALL PLUGIN users;

INSTALL PLUGIN还能从mysql.plugin表里注销插件,这样服务器在后续的重启中便不会再加载它。
如果某个插件被设计成不允许在运行时卸载,只在服务器关闭时,才可停用,则执行UNSTALL PLUGIN会报错。
INSTALL/UNSTALL PLUGIN需分别对mysql.plugin表有INSERT和DELETE权限。
不管你在服务器启动时加载插件还是运行时加载,都可用SHOW PLUGINS或INFORMATION_SCHEMA库的PLUGINS表来查看存在哪些插件。

如果服务在启动时,加载某个插件的原因是该插件是内建的,注册在mysql.plugin表里的,或该插件是使用选项–plugin-load或–plugin-load-add指定的,则服务器可能会控制它的激活状态。
可在该插件后面加一个选项。
如 --my_engine=ON 或 --my_engine=OFF 可在插件名后紧跟着指定一个可选值。

  • OFF
    不激活
  • ON
    激活
  • FORCE
    类似ON,但如插件加载失败,服务器不会启动
  • FORCE_PLUS_PERMANENT
    服务器会阻止在运行时使用UNINSTALL PLUGIN卸载该插件。

存储引擎配置

选择存储引擎

可用SHOW ENGINES查询INFORMATION_SCHEMA库的ENGINES表。

选择默认存储引擎

若让MyISAM为默认的存储引擎,可在服务器选项文件里加入下面内容。

[mysqld]
default_storage_engine=myisam

要想在运行时更改默认存储引擎,可用下面这些语句中的某一条。

SET GLOBAL default_storage_engine=engine_name;
SET SESSION default_storage_engine=engine_name;

要查看全局和当前会话的默认存储引擎,可用下面这句:

SELECT @@GLOBAL.default_storage_engine,@@SESSION.default_storage_engine;

对TEMPORARY表,需用独立变量default_tmp_storage_engine来指定默认引擎.
如果启动服务器时用了–innodb=OFF,就需将
default_storage_engine设为其他某个存储引擎。

配置InnoDB存储引擎

InnoDB管理着一个用于存储表内容和其数据字典的
系统表空间。
也允许配置为每个表一个表空间。

配置InnoDB表空间

对存储在系统表空间里的InnoDB表,唯一与之管理的文件便是.frm格式文件。
这个文件存放在InnoDB表所属的数据库的数据库目录里,系统表空间还含有存储着与表结构有关的信息的InnoDB数据字典。
innodb_file_per_table下每个表有自己独立的表空间,
但系统表空间仍然需维护全局数据字典。

1. InnoDB系统表空间配置参数

  • innodb_data_home_dir
    用于定义构成表空间的所有组成文件的父目录。
    默认值为服务器数据目录。
  • innodb_data_file_path
    用于定义位于InnoDB主目录下的那些表空间组成文件的规格。
    每个规格包含文件名,文件大小,某些其他可能选项。
    表空间各组成文件的总大小不得小于10MB。
    默认下,InnoDB会在服务器的数据目录里创建一个名为ibdata1,大小为10MB的自扩展文件,并把它作为表空间。
    例如,要在数据目录里创建一个表空间-由两个大小皆为4GB,名字分别为innodata1和innodata2的文件构成。
    文件配置如下:
[mysqld]
innodb_data_file_path=innodata1:4G;innodata2:4G

InnoDB按以下规则组合 innodb_data_home_dir和innodb_data_file_path值,以确定表空间文件的路径名。

  • 如果未指定innodb_data_home_dir,默认值为服务器数据目录路径名, 且InnoDB会把innodb_data_file_path里的文件名解释为相对于该数据目录的。
  • 如果 innodb_data_home_dir不空,则InnoDB会把它解释为innodb_data_file_path里所有文件规格所在的目录,且会把这些文件名解释为相对于innodb_data_home_dir值的,
  • 如果显式将innodb_data_home_dir设置为空,则InnoDB会把innodb_data_file_path里的所有文件规格当做绝对路径名。

2. 配置InnoDB系统表空间
要想对只包含常规文件的系统表空间进行初始化设置,可执行如下:

  • (1)把相应的设置行添加到选项文件里.
  • (2)确认将被创建的各个表空间组成文件所在的目录都已存在。
    InnoDB只创建文件,不创建目录。
  • (3)确认那些表空间组成文件都不存在。
  • (4)启动服务器。

要想显式地配置表空间,需先停止服务器,删除与InnoDB有关的文件(如表空间文件和日志文件);接着,指定要使用的配置选项,重启服务器。

如果已经创建了某些表,则需在重新配置前,用mysqldump工具把那些表转储出来,在完成配置后再重新加载它们。

把原始分区用作InnoDB系统表空间的组成部分需稍微复杂一些。
好处:

  • 可轻易创建非常巨大的表空间。
    分区组成可扩展到整个分区,而常规的文件组成会受到操作系统所允许的最大文件大小的限制。
  • 可保证每个原始分区在磁盘上都拥有一个完全连续的空间,而常规文件受文件系统碎片影响。
    为减少常规文件碎片,InnoDB存储引擎初始化表空间时,会尽量向有关文件写入足够多的零,迫使操作系统把空间一次性全部分配给常规文件。
  • 原始分区通过消除文件系统管理层来减少开销。

不利:
你的系统备份软件可能只是面向文件系统使用的,而不能面向分区。此时,使用分区会使系统备份变得更加困难。

将原始分区包含在表空间涉及两个操作:
a.初始配置
b.重新配置

如Unix上,想在其上用一个路径名为/dev/rdsk8,大小为200GB的原始分区。

  • (1)使用带有newraw后缀的大小值来初始配置原始分区。
    该后缀告诉InnoDB,该文件是一个需要初始化的原始分区:
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Gnewraw
  • (2)启动服务器。
  • (3)在InnoDB初始化分区之后,停止服务器。
  • (4)重新配置分区规格,把后缀newraw改为raw。
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/rdsk8:200Graw
  • (5)再次启动服务器
    InnoDB现在看到的后缀是raw,而非newraw。
    它会假定这个分区已被初始化,且可按读/写方式来使用此表空间。
    如果把原始分区指定为InnoDB表空间的一部分,则需确保对其设置了访问权限,以便服务器可对它进行读/写。
    还需确保这个分区未被用作其他用途。
    在建立初始表空间时,如因为InnoDB不能创建某个必要的文件导致启动失败,则检查出错日志。
    再删除创建的所有文件,修正配置错误,重启服务器。

3. 重新配置InnoDB系统表空间

初始化InnoDB系统表空间,并开始使用后,便不能再更改其组成文件的大小。
不过,可在现有表空间组成文件列表末尾添加一个新的文件。

>SHOW TABLE STATUS LIKE 'tbl_name';

添加组成文件来扩大InnoDB表空间:

  • (1)停止正运行的服务器.
  • (2)如表空间的最后一个组成是自扩展文件,则需先将其规格改为固定大小,然后在其后添加另一个文件。需先确定此文件当前大小。
  • (3)把新组成的规格添加到现有文件列表末尾。
    如果新组成是一个常规文件,需保证它还不存在.如是一个原始分区,(需先用newraw+启动+停止+改为raw+再次启动)。
  • (4)重启服务器。

4. 使用单独的InnoDB表空间

[mysqld]
innodb_file_per_table=1

每个新创建的InnoDB表都将有一个.frm格式文件和一个.ibd数据文件。
它们都存放在包含这个表的那个数据库所在的目录里。
如果有必要,InnoDB会自动扩展.ibd文件。

启用或禁用使用单独的表空间会对InnoDB如何创建新表产生影响。

对使用自己的.idb文件进行存储的表,InnoDB会启用其他几项功能。

  • 对未被其他表以外键形式进行引用的表,TRUNCATE TABLE执行速度更快,且可重新申请磁盘空间;但存储在系统表空间的表不具备此特点。
  • 单个文件单个表空间下可用Barracuda文件格式。
    可在运行时,临时更改innodb_file_per_table, innodb_file_format。

InnoDB存储引擎的变量

InnoDB也有其自己的日志文件和内存缓冲区,及一些其他的配置参数。

  • innodb_buffer_pool_size
    缓冲池大小
  • innodb_log_buffer_size
  • innodb_log_group_home_dir
    InonDB有其自己的日志文件,如果服务器启动时不存在,会被自动创建。
    日志文件的名字都是以ib_作为开头。
    默认下,在数据目录里创建它们。
    要想显式指定InnoDB写入日志文件的目录路径名,可用innodb_log_group_home_dir。
    InnoDB不会创建目录。
  • innodb_log_file_size / innodb_log_files_in_group
    当InnoDB的日志被写满时,InnoDB会把缓冲区里的信息写入磁盘。
    innodb_log_file_size可更改日志文件大小,修改innodb_log_files_in_group可更改日志文件的个数。
    两者相乘为日志文件总大小,不可超过4GB。
    如果已创建了日志文件,并想更改它们的大小,则需完全关闭服务器,以使InnoDB能彻底处理好正进行中的事务。
    再删除那些日志文件,重新配置,重启服务器。

全球化问题

国际化:
软件遵照本地习惯使用的能力。
本地化:
从软件支持的本地习惯列表中选择使用某组特定的习惯。

MySQL的国际化和本地化配置涉及以下几个方面:

  • 服务器默认时区。
  • 默认字符集和排序规则。
  • 显示诊断和出错信息所使用的语言。
  • 月份和日期名称的区域设置。

配置时区支持

MySQL可通过检查系统环境来设置默认时区。
大部分下为服务器主机的本地时区。
也可在启动服务时显示指定时区。
服务器允许每个客户端改写自己的时区。

时区信息保存在下面这两个系统变量里。

  • system_time_zone
    是服务器在启动时确定的在服务器主机上实际使用的时区。
    如果把环境变量TZ设为期望的时区,则会对服务器在启动时如何设置system_time_zone产生影响。
    在Unix里,另一种设置时区的方法是在mysqld_safe的启动脚本里指定一个–timezone选项。
    最好是把这个选项放到某个选项文件的[mysqld_safe]选项组里,尤其在你通过mysql.server脚本间接调mysqld_safe时候。
    如指定美国中部时间:
[mysqld_safe]
timezone=CST6CDT
  • time_zone
    是MySQL服务器的默认时区。
    默认下,值为SYSTEM,表示使用system_time_zone设置。
    服务器在运行时会使用全局的time_zone值为每一个连接上的客户端设置会话级的time_zone值,使其成为客户端的默认时区。
    任何客户端可通过设置会话级time_zone来重新设置自己的会话级时区。.
    拥有SUPER权限的管理用户可设置全局的time_zone变量。
    要确定当前的全局和会话级时区值,可用:
>SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

time_zone可接受三种类型的值,其中一种还需额外的管理动作。
如果你有SUPER权限,则可用GLOBAL来设置全局值。

  • 要使用system_time_zone,可把time_zone设为SYSTEM :
SET SESSION time_zone='SYSTEM';
  • 要想指定相对于UTC的偏移值,可用带正负号的小时和分钟格式:
SET SESSION time_zone='+00:00';
SET SESSION time_zone='+03:00';
SET SESSION time_zone='-11:00';
  • 要想引用区域设置,可用命名时区:
SET SESSION time_zone='US/Central';
SET SESSION time_zone='CST6CDT';
SET SESSION time_zone='Asia/Jakarta';

上述通过名字设置时区,需让服务器理解时区的名字,需把操作系统时区文件里的信息加载到mysql数据库的一组表里。
要在带有时区文件的系统里手动填充那些时区表,需确定这些文件的安装目录。
然后,使用mysql_tzinfo_to_sql读取这些文件,根据其内容构造SQL语句,并把这些语句送入mysql程序执行。
如果时区文件位于/usr/share/zoneinfo目录,则把它们加载到mysql数据库的语句如下所示:

% mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -p -u root mysql

选择默认字符集和排序规则

默认的字符集和排序规则分别为latin1和latin1_swedish_ci。
要想在服务器启动时更改这些值,可设置系统变量character_set_server和collation_server。

% mysqld --character_set_server=utf8\
	--collation_server=utf8_icelandic_ci

如果是根据源代码来建立服务器,可在运行CMake时
通过选项DEFAULT_CHARSET和DEFAULT_COLLATION 来更改这些默认值。
例如:

%cmake -DDEFAULT_CHARSET=utf8\
	-DDEFAULT_COLLATION=utf8_icelandic_ci

运行客户端时,可通过–default-character-set来指明它所使用的字符集。
如果在客户端程序的默认位置未找到字符集文件,可用–character-sets-dir来告知客户端程序具体位置。

选择出错信息的显示语言

想知道哪些语言可选用,可查看MySQL安装目录下的share目录。
其中各个子目录的名字正好与各种可用的语言对应。

要知道出错信息的显示语言,可把系统变量lc_messages配置为适当的区域设置。
服务器会将区域设置名称转换为语言名称,并在变量lc_messages_dir指出的目录中查找该语言的子目录,从而找到包含出错信息文件的目录。

如果默认目录不正确,需将lc_message_dir设为正确的路径。

例如:
把出错信息显示为德语,指明出错信息位于/var/mysql/share目录下:

% mysqld --lc_messages=de_DE --lc_messages_dir=/var/mysql/share

单个客户端可在运行时设置lc_messages的会话值,以选择另一种语言。
当同一服务器的不同客户端需以不同于默认值的某种语言显示本地化出错信息时,可用。

选择区域设置

MySQL服务器依靠系统变量 lc_time_names来决定如何显示月份和日期名称。
该变量值会对许多时态函数如DAYNAME(),MONTHNAME(),DATE_FORMAT()的结果产生影响。

默认区域设置为en_US。
如果选择一个不同的区域设置,可在服务器启动或运行时设置lc_time_names。
各个客户端可通过在运行时设置lc_time_names的会话值来改写默认值。

服务器调整

对MySQL服务器及运行它的那台机器有控制权限的管理员,可进行一些优化或调整。
例如,可调整与查询处理有关的服务器参数。

用于服务器调整的通用型系统变量

  • back_log
    在处理当前连接时,排队等待连接的最大请求数。
  • max_connections
    服务器支持的最大客户端并发连接数。
  • table_open_cache
    当服务器打开表文件时,会试图将它们保持在打开状态,以减少必须要完成的文件打开操作和文件关闭操作数量。
    它会在一个表缓存里存放与所有打开文件有关的信息.
    如服务器访问了大量表,则这个表缓存可能会被填满,服务器会关闭一些最近未打开的表。
  • table_definition_cache
    如果增大table_open_cache还需考虑增大table_definition_cache 的值。
    它控制着存储表定义的缓存大小。
  • open_files_limit
    如增大max_connections或table_open_cache 的值,服务器会需要更多的文件描述符。
    突破单个进程文件描述符限制的解决办法是:
    为MySQL主服务器建立一个或多个从服务器。
    所有的更新都被导向主服务器,但来自客户端的单纯的检索请求,可分散到所有的服务器。
  • max_allowed_packet
    用于客户端通信的那个缓冲区的最大大小可增大。
    默认缓冲区大小为1MB。
    允许的最大值为1GB。
    这变量不是一个与性能密切相关的参数,但把这个值调大,可防止在处理更大的数据包时发生错误。
    数据包缓冲区的内存只在需要时才分配。
    客户端mysql和mysqldump都有自己的max_allowed_packet变量。
    如果客户端向服务器发送了很长的语句,则可能需同时在服务器端和客户端增加这个变量的值。
    如果启动服务器时将包的大小限制为16MB。
[mysqld]
max_allowed_packet=16M

如只是偶尔需以16MB的数据包限制来调mysql或mysqldump,可:

% mysql --max_allowed_packet=16M ...
% mysqldump --max_allowed_packet=16M ...

要想一直使用,可将其添加到选项文件:

[mysql]
max_allowed_packet=16M

[mysqldump]
max_allowed_packet=16M

有些变量控制的资源是按每个客户端来分配的。
如果同时有大量的客户端连接服务器,则加大这些变量的全局值,可能导致服务器的资源占用量急剧上升。

可把read_buffer_size和sort_buffer_size值加大。
分别决定了读取,排序的缓冲区大小。

存储引擎调整

InnoDB和MyISAM中最为重要的与性能相关的资源。
各个存储引擎表信息缓存一般有不同的名字(InnoDB叫缓冲池,MyISAM叫键缓冲),但每个操作的一般原则相同。

  • 开始时,缓存为空。
  • 服务器在语句执行期间需检查表的信息时,会检查该信息是否已经读入缓存。
    如已读入,则服务器会查询内存中的值。否则,存储引擎表会把内容从磁盘读到缓存。
  • 如缓存在必须读入新值时已满,需丢弃旧的信息,以便为新信息腾出空间。
    默认下,每个存储引擎基于最近最少使用来确定要丢弃的缓存块。
  • 如果丢弃的缓存块未被修改过,它的内容直接被新读入值覆盖。否则,需将已修改内容写回。
    如果缓存中找不到请求值,需从磁盘读入。

配置InnoDB的缓冲池

InnoDB把它的缓冲池看作一个块列表,该列表被分成新,旧两个子列表,分别含最近被访问较多和较少的缓存块。
InnoDB使用的是中点插入策略,即把当前新的缓存块添加到缓冲池时,会将其放置在旧子列表前面(正好是新子列表尾部)。

默认下,InnoDB会把缓存块插到旧子列表前,接着会在插入之后第一次访问这个缓存块时,将其移动到新子列表前。

新子列表的缓存块随着时间推移,越过旧子列表分界线
旧子列表里的缓存块会逐步老化到列表最后,被丢弃。

下面两系统变量可控制InnoDB缓冲池大小和控制它是否可被分为更小的缓冲池。

  • innodb_buffer_pool_size
    分配给缓冲池的总内存,单位字节。
    一般原则是使用系统内存的70%~80%。
  • innodb_buffer_pool_instances
    默认下,此变量值为1,且只有一个单独的缓冲
    如果 innodb_buffer_pool_size至少为1GB,且将innodb_buffer_pool_instance设成大于1,则InnoDB会把这个缓冲池处理成许多小的缓冲池实例,每个独立运作。
    InnoDB会把从磁盘读到的缓存块随机分配给某个给定的缓冲池实例,这会减少竞争。

有两个系统变量可对InnoDB缓冲池的LRU算法产生影响。

  • innodb_old_blocks_pct
    缓冲池的旧子列表所占的百分比。
    影响新子列表中的缓存块变化为旧子列表中缓存块的速。度
  • innodb_old_blocks_time
    一个缓存块在第一次访问后,下次访问前,需在旧子列表里待多少毫秒才能移到新子列表。

配置MyISAM的键缓冲区

MyISAM在存储表时使用了单独的数据文件和索引文件
处理它们的方式也有所不同。

  • 为缓存从数据文件读到的数据行,或写到数据文件的数据行,MyISAM依托操作系统,使用它的文件系统缓存机制。
  • 为处理索引文件,MyISAM维护了一个键缓冲区,用它来执行基于索引的检索和排序操作,及索引的创建和修改操作。

MyISAM的键缓冲区,默认大小为8MB。
如果你用了大量的MyISAM表,且有多余内存可使用,则把键缓冲区设的大一些,应能在处理索引相关操作时提高MyISAM的性能。

配置缓冲区的方法是,对系统变量key_buffer_size进行设置。

[mysqld]
key_buffer_size=512M

MyISAM键缓冲区在所有MyISAM表之间默认是共享的。
如果缓存中找不到键值,且缓存已满,则产生竞争,此时,需丢弃当前缓存中值,下次需要时,再从磁盘取。

如果某个MyISAM表被使用的频率高,则确保其键保留在内存可带来很多好处。

无论这些键是从一个表里读取,还是从其他一些表里读取,竞争都出现。
可通过把键缓存增大到足以容纳给定表全部索引的方式,来避免同表竞争,但来自其他表的键仍会争抢缓存里空间。

可通过下面几项功能对缓存操作进行更多控制:

  • 可使用默认的单个键缓存,也可创建多个缓存。
  • 可控制总的缓存大小,缓存块大小和缓冲区丢弃算法。
  • 可将表分配给某些特定的缓存,并把表索引预加载到其中的某个缓存。

创建一个足够大的能完全容纳下一个表的索引的缓存
并将此缓存设置为仅供这个表使用。
在所有键都加载到缓存后,便不再需要任何磁盘I/O。
也不需从缓存中丢弃那些键值,针对该表的键查找也可在内存完成。

另一个常见的策略是,将一组被频繁使用的表分配给一个单独的键缓存,以使它们的索引缓存不会与其他表产生竞争。

要允许对MyISAM键缓存进行配置,服务器需将每一个缓存都与一组系统变量关联一起。
可将这些变量分为多个组成部分,共同组成一个结构化的系统变量。
结构化变量是简单系统变量的扩展,可使用"缓存名+变量名"的语法形式对其访问。

cache_name.var_name

每个缓存结构化变量有下面几个组成部分。

  • key_buffer_size
    键缓存总大小
  • key_cache_block_size
    键缓存的块大小。
    默认下,缓存块大小为1024字节。
  • key_cache_limit
    对缓冲区重用算法产生影响。
    如果设置为它的默认值100,则键缓存会使用最近最少使用策略来决定重用哪些缓存缓冲区。
  • key_cache_age_threshold

使用查询缓存

查询缓存有这样几个特点。

  • 某条给定的SELECT语句首次执行时,服务器记住其文本及返回结果。
    返回结果不确定时,不会缓存。
    表被修改时,指向它的缓存查询被丢弃。
>SHOW VARIABLES LIKE 'have_query_cache';

对支持查询缓存的服务器,缓存操作依赖于下面三个系统变量值。

  • query_cache_type
    决定了查询缓存的操作模式。
模式含义
不缓存
将可缓存的查询缓存
只将以SELECT SQL_CACHE开头的可缓存查询缓存
  • query_cache_size
    决定了分配给缓存的内存数量,单位字节。
  • query_cache_limit
    被缓存的结果集大小的最大值。
    大于此值的查询结果不被缓存。

硬件优化

更大的内存,性能更好的磁盘,利用并行,多处理器。

服务器日志

MySQL服务器可生成多种类型日志:

  • 出错日志
    记录包括服务器的启动,关闭,问题或异常条件有关的消息。
  • 普通查询日志
    记录包括客户端连接,从客户端收到的SQL语句和其他杂项。
  • 慢查询日志
    可帮你把那些可能需重写,以求获得更好性能的语句识别出来。
  • 二进制日志及二进制索引文件
    这种日志由一个或多个文件构成,记录由UPDATE, DELETE, INSERT, CREATE TABLE, DROP TABLE, GRANT等语句所做的修改。
    写到二进制日志里的内容都是一些以二进制格式编码的数据修改"事件"。
    二进制日志文件都伴随有一个索引文件,其中列出了当时存在的那些二进制文件。
    二进制日志用途:
    • 服务器崩溃后,可与备份一起配合完成表的恢复:
      先根据备份文件恢复数据库;再用mysqlbinlog将二进制日志的内容转换为文本语句,并使用备份后修改数据库的那些语句作为客户端mysql的输入,把数据库恢复到崩溃时状态。
    • 它形成了复制的基础。
      存储在二进制日志里的数据修改事件可被传输到复制从服务器
  • 中继日志及中继日志索引文件
    如果服务器是一个复制从服务器,它会维护一个中继日志,其中包含的是从主服务器接收到的需要被执行的数据修改事件记录。
    中继日志文件的格式与二进制日志文件的格式相同,它有一个索引文件,其中列出的是从服务器上存在的日志文件。

默认下,每个被启用的日志会以文件形式写到数据目录里。
对某些类型的日志,你可选择把它们写到其他地方。

  • 出错日志,可被发送到syslog。

  • 普通查询日志和慢查询日志可被写到mysql数据库的表里。

  • 在Unix里,如果用mysqld_safe脚本来启动服务器,则该脚本会创建出错日志,并告知服务器使用它。

选项用途
–general_log启用普通日志
–general_log_file=file_name生成日志文件名
–log-bin[=file_name]启用二进制日志
–log-bin-index=file_name二进制日志索引文件
–log_error[=file_name]启用出错日志
–log_output[=destination]普通查询/慢查询日志存放位置
–relay-log[=file_name]启用中继日志
–relay-log-index=file_name中继日志索引文件
–slow_query_log启用慢查询日志
–slow_query_log_file=file_name慢查询日志文件名

举例:
启用一个名为log.err的出错日志和一个名为qlog的普通查询日志。

[mysqld]
log_error=log.err
general_log
general_log_file=qlog

要显示二进制日志或中继日志文件内容,可用mysqlbinlog。

出错日志

服务器用出错日志来记录启动,关闭,诊断和出错信息。

Unix里的出错日志

mysqld默认不创建出错日志,但会把诊断输出发送到控制台。
如果你直接调mysqld,可通过设置系统变量log_error将出错输出发到某个文件。
可在命令行或某个选项文件的[mysqld]组里设置这个变量。

如果你启动服务器的方式是调mysql_safe,则服务器会默认创建出错日志,因为mysql_safe在调mysqld时,会把服务器的输出重定向到出错日志。
默认的出错日志文件名为HOSTNAME.err。
要使用另外的出错日志名,可在[mysqld_safe]/[mysqld]设置log_error。

普通查询日志

客户端何时连到服务器,客户端发给服务器的每一条SQL语句及其他事件。
启用系统变量general_log来启用。
指定general_log_file来指定名称。
默认名称为HOSTNAME.log。

慢查询日志

慢查询还会使得服务器递增其slow-queries状态变量
服务器写入的慢查询日志是文本格式的。
慢查询日志有助于把在重写时可进行改进的查询标识出来。
启用系统变量slow_query_log来启用。
设置slow_query_log_file来指定文件名。
默认为HOSTNAME-slow.log。

二进制日志

记录数据修改"事件"。
二进制日志用途包括数据备份和恢复,且支持服务器间的复制。
要把某个服务器设为主服务器,使其可被复制到从服务器,必须启用二进制日志。
修改事件,按发生顺序写入二进制日志。
事务被提交时,关联的修改才会写入二进制日志。

启用二进制日志的方法是指定–log-bin来启用。
默认文件名HOSTNAME-bin.编号。
启用了二进制日志,服务器还会创建一个附带的二进制日志索引文件。
来列出现有二进制日志文件名字。

如果将二进制日志用于服务器间复制,则在删除某个给定的二进制日志文件前,要先确认其包含的内容已被复制到所有可用的从服务器,并且的确不需要了。

中继日志

需与复制机制中的从服务器一起使用。
复制从服务器负责接收来自主服务器的数据修改信息,并在接收到它们时将其写到中继日志。

从服务器会将中继日志当作一个保存区,其中存储的事件会被保留到它们被从服务器执行为止。

从服务器上,一个线程负责从主服务器读取事件,写到中继日志;一个线程负责读取中继日志文件,执行其中包含的事件,删除处理完毕的文件。

中继日志和二进制日志共同特点:

  • 服务器按编号顺序创建中继日志文件。
  • 有一个索引文件,列出当前存在的所有中继日志文件集合。
  • 中继日志文件格式与二进制日志文件相同。

指定–relay-log来启用。
默认文件名为HOSTNAME-relay-bin.编号。

使用日志表

启用了普通查询日志或慢查询日志功能时,可选择让服务器把日志输出写入日志文件,写入mysql数据库的日志表,或同时写到这两个地方。
设置general_log来启用普通查询日志。
slow_query_log来启用慢查询日志。
指定日志存储到table时,分别存储到mysql数据库的general_log和slow_log。

日志管理

  • 日志轮换法
    适用于文件名固定的日志文件。
  • 使用期限
    超期日志自动删除。
  • 与复制有关的过期
    复制从服务器按编号创建中继日志文件。
    会在处理完它们后将其删除。
    来设置max_relay_log_size调节最大大小。
  • 日志表截短/轮换法

日志与数据库备份要综合考虑。

轮换固定名字的日志文件

要让固定名字的日志文件过期,可用日志轮换方法。

一个完成对固定名字的日志文件轮换的shell

#!/bin/sh
#rotate_fixed_logs.sh
#参数1:日志文件名
if [$# -ne 1]; then
	echo "Usage:$0 logname" 1>&2
	exit 1
fi
logfile=$1
mv $logname.6 $logname.7
mv $logname.5 $logname.6
mv $logname.4 $logname.5
mv $logname.3 $logname.4
mv $logname.2 $logname.3
mv $logname.1 $logname.2
mv $logname $logname.1
mysqladmin flush-logs

二进制日志文件和中继日志文件的过期处理

对二进制日志,有以下两种方法可供选择。

  • 基于日志文件的使用期限(按最后一次修改时间)来决定是否过期。
  • 基于日志文件是否仍在使用来决定其是否过期。

超过7天为过期,会被删除。

[mysqld]
expire_logs_day=7 

自动完成日志过期处理

在Unix下,可用cron,建立一个定义有过期调度的crontab文件。

若你想用rotate_fixed_logs.sh来轮换一个名为qlog的普通查询日志,并假设该脚本安装在/home/mysql/bin目录,日志文件放在/var/mysql/data目录。
先以mysql用户身份登录,再编辑mysql用户的crontab文件:

% crontab -e

往里添加一行。

30	4 * * * /home/mysql/bin/rotate_fixed_logs.sh /var/mysql/data/qlog

日志表的过期或轮换
截断表:

USE mysql;
TRUNCATE TABLE general_log;
TRUNCATE TABLE slow_log;

要轮换日志表,需先为它创建一个空副本。
再执行一个原子重命名操作,在一条语句里置换出当前表,用空副本替换它:

USE mysql;
DROP TABLE IF EXISTS general_log_tmp, general_log_old;
CREATE TABLE general_log_tmp LIKE general_log;
RENAME TABLE general_log TO general_log_old,
general_log_tmp TO general_log;
DROP TABLE IF EXISTS slow_log_tmp, slow_log_old;
CREATE TABLE slow_log_tmp LIKE slow_log;
RENAME TABLE slow_log TO slow_log_old, slow_log_tmp TO slow_log;

学习参考资料:

《MySQL技术内幕》第5版
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBC(Java Database Connectivity)是Java语言操作数据库的基础API,它提供了一种标准的方法来连接和操作各种关系型数据库。 JDBC的基本使用分为以下几个步骤: 1. 加载驱动程序:在使用JDBC操作数据库之前,需要先加载相应的驱动程序。不同的数据库需要加载不同的驱动程序,一般情况下驱动程序的jar包都会提供。 ```java Class.forName("com.mysql.jdbc.Driver"); ``` 2. 建立连接:使用DriverManager类的getConnection()方法连接数据库。 ```java String url = "jdbc:mysql://localhost:3306/test?useSSL=false"; String username = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, username, password); ``` 其中url为连接数据库的URL,username和password为连接数据库的用户名和密码。 3. 创建Statement对象:通过Connection对象的createStatement()方法创建一个Statement对象,用于执行SQL语句。 ```java Statement stmt = conn.createStatement(); ``` 4. 执行SQL语句:可以通过Statement对象的execute()或executeQuery()方法执行SQL语句,如果是更新操作则使用executeUpdate()方法。 ```java ResultSet rs = stmt.executeQuery("SELECT * FROM users"); ``` 5. 处理结果集:如果执行的SQL语句返回了结果集,则可以通过ResultSet对象进行处理。 ```java while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("id: " + id + ", name: " + name); } ``` 6. 关闭连接:使用完数据库后需要关闭连接,释放资源。 ```java rs.close(); stmt.close(); conn.close(); ``` 以上就是JDBC的基本使用过程,通过JDBC可以实现Java程序与数据库的交互,完成各种数据库操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值