一、mysql的简介
二、mysql的编译包安装目录结构详解
1)编译包解压之后的目录结构
mysql-5.6.39
├── bin # 存放的是服务器和客户端的程序(命令)
├── COPYING # 跟版权相关的
├── data # 存放数据的目录,由于指定了/mysql/data/,那么这个目录就不再使用了
├── docs # 文档
├── include # 存放的头文件
├── lib # 存放库文件
├── man # man手册
├── mysql-test # MySQL测试相关
├── README # 简介
├── scripts # 脚本目录
├── share # 共享路径及其他
├── sql-bench # benchmarks性能测试
└── support-files # 模板文件
2)在初始数据库之后,存放数据文件夹下的目录结构
data/
├── Server.uplooking.com.err # 错误日志文件,其中前面的名称生成的不同电脑生成不同
├── Server.uplooking.com.pid # pid文件,其中前面的名称生成的不同电脑生成不同
├── auto.cnf #
├── ibdata1 # 系统自己命名的数据文件
├── ib_logfile0 # 系统自己命名的日志文件
├── ib_logfile1 #
├── mysql # 数据库,mysql是必存在
├── performance_schema # 数据库
└── test # 数据库
三、初始化脚本的解析
1)mysql_install_db的作用
mysql_install_db是一个默认放在mysql/scripts的一个初始化脚本。该脚本可以在任何装有perl的操作系统上被使用,在5.6.8之前的版本,该脚本是一个shell脚本,并只能在unix平台上使用。5.7.6以后的版本,该脚本也将被移除。当MySQL的系统库(mysql系统库)发生故障或需要新加一个mysql实例时,需要初始化mysql数据库。
功能:
a、运行这个脚本,会初始化mysql的data目录,并且创建那些系统表。同样也会初始化系统表空间并且关联innodb表与数据结构。
b、截至5.6.8版本,在unix平台,mysql_install_db创建一个被命名为“my.cnf”默认的参数文件在base安装目录。该my.cnf是根据mysql/support-files/my-default.cnf所创建的。如果my.cnf已经存在,脚本会假定my.cnf正在被使用,并会创建一个被命名为“my-new.cnf”的文件。
2)mysql_install_db脚本执行的参数详解
#为mysqld服务的运行用户
--user=mysql
#mysql的安装目录
--basedir
#数据存放目录
--datadir
#在5.6.8之后的版本,用此种方式初始化后,root密码将会存放在 /root/.mysql_secret中
--random-passwords
#显示帮助信息
--help
#build 目录的路径,用于out-of-source构建。
--builddir=path
#供内部使用。
--cross-bootstrap
#在读取全局选项文件和在读取用户选项文件之前,读取这个文件(选项文件),如果该文件不存在,将会抛出错误。(仅限unix平台)
--defaults-extra-file=name
#用被提供的选项文件,如果该文件不存在,将会抛出提示。
--defaults-file=name
#当dns无法用时将通过ip地址代替。
--force
#与--datadir同义。
--ldata=path
#不读取任何选项文件,该选项在mysql_install_db启动时,若因为读取了未知的参数而启动失败时使用。
--no-defaults
#在5.6.20中被添加,mysql_install_db保存任何已经存在的my.cnf文件,并且不创建新的默认my.cnf文件。
--keep-my-cnf
#供内部使用。
--rpm
#当创建授权表时,用ip地址而不是host名,这个选项在你的DNS不起作用时,非常有用。
--skip-name-resolve
#供内部使用。
--srcdir=path
3)mysql_install_db的
#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
my @req_mods = ('Fcntl', 'File::Basename', 'File::Copy', 'Getopt::Long',
'Sys::Hostname', 'Data::Dumper');
my @missing_mods;
my $req;
foreach $req (@req_mods) {
eval 'require ' . $req;
if ($@) {
push(@missing_mods, $req);
} else {
$req->import();
}
}
local $SIG{__DIE__} = sub {warn @_; exit 1};
if (@missing_mods) {
my $msg = "FATAL ERROR: please install the following Perl modules " .
"before executing $0:\n" . join("\n",@missing_mods)."\n";
die $msg;
}
}
Getopt::Long::Configure("pass_through");
my @args;
my $basedir;
sub usage
{
print <{help};
if ( $opt->{'no-defaults'} && ( $opt->{'defaults-extra-file'} ||
$opt->{'defaults-file'} ) )
{
error($opt,
"Cannot use both --no-defaults and --defaults-[extra-]file");
}
@args = @ARGV if $pick_args;
@ARGV = @saved_ARGV;
}
sub find_in_basedir
{
my $opt = shift;
my $mode = shift;
my $files = shift;
foreach my $file ( @{ref($files) ? $files : [$files]} )
{
foreach my $dir ( @_ )
{
foreach my $part ( "$file","$file.exe","release/$file.exe",
"debug/$file.exe","relwithdebinfo/$file.exe" )
{
my $path = "$basedir/$dir/$part";
if ( -f $path )
{
return $mode eq "dir" ? dirname($path) : $path;
}
}
}
}
}
sub cannot_find_file
{
my $file = shift;
print "FATAL ERROR: Could not find $file\n";
print "\n";
print "If you compiled from source, you need to run 'make install' to\n";
print "copy the software into the correct location ready for operation.\n";
print "\n";
print "If you are using a binary release, you must either be at the top\n";
print "level of the extracted archive, or pass the --basedir option\n";
print "pointing to that location.\n";
print "\n";
exit 1;
}
sub quote_options {
my @cmd;
foreach my $opt ( @_ )
{
next unless $opt;
push(@cmd, "\"$opt\"");
}
return join(" ", @cmd);
}
sub basic_single_escape {
my ($str) = @_;
$str =~ s/([\'])/\\$1/g;
return $str;
}
my $secret_file;
my $escaped_password;
sub ensure_secret_file {
$secret_file = $ENV{HOME} . "/.mysql_secret";
foreach my $file ( $secret_file ) {
next if -f $file;
local *FILE;
sysopen(FILE, $file, O_CREAT, 0600)
or die "ERROR: can't create $file: $!";
close FILE;
}
}
sub append_file {
my $file = shift;
-f $file or die "ERROR: file is missing \"$file\": $!";
open(FILE, ">>$file") or die "ERROR: can't append to file \"$file\": $!";
foreach my $line ( @_ ) {
print FILE $line, "\n";
}
close FILE;
}
sub tell_root_password {
my $now = localtime();
append_file($secret_file,
"# The random password set for the root user at $now (local time): " .
$escaped_password,
"");
print "A random root password has been set. You will find it in '$secret_file'.\n";
}
sub generate_random_password {
my $randfile = "/dev/urandom";
open(FD, $randfile) || return "";
my $password = "";
my $pass_len = 16;
my $c;
while (length($password) < $pass_len) {
$c = getc(FD);
if ($c =~ /\w/) {
$password .= $c;
}
}
close(FD);
return $password;
}
my $opt = {};
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV);
if ( $opt->{srcdir} ) {
$basedir= $opt->{builddir};
} else {
$basedir= $opt->{basedir};
}
$basedir= "." if ! $basedir;
my $print_defaults;
my $keep_my_cnf = 0;
if ( $opt->{srcdir} and $opt->{basedir} )
{
error($opt,"Specify either --basedir or --srcdir, not both");
}
if ( $opt->{'keep-my-cnf'} )
{
$keep_my_cnf = 1;
}
if ( $opt->{srcdir} )
{
$opt->{builddir} = $opt->{srcdir} unless $opt->{builddir};
$print_defaults = "$opt->{builddir}/extra/my_print_defaults";
}
else
{
$print_defaults = find_in_basedir($opt,"file","my_print_defaults","bin","extra");
}
if ( ! $print_defaults )
{
$print_defaults='./bin/my_print_defaults';
}
-x $print_defaults or -f "$print_defaults.exe"
or cannot_find_file($print_defaults);
my $config_file;
my $copy_cfg_file;
my $cnfext = ( $^O =~ m/^(MSWin32|cygwin)$/ ) ? "ini" : "cnf";
$config_file= "$basedir/my.$cnfext";
my $cfg_template= find_in_basedir($opt,"file","my-default.$cnfext",
".", "share","share/mysql","support-files");
if ((! -r $cfg_template) && (-r "./share/my-default.cnf")) {
$cfg_template = "./share/my-default.cnf";
}
-e $cfg_template or cannot_find_file("my-default.$cnfext");
$copy_cfg_file= $config_file;
my $failed_write_cfg= 0;
if (-e $copy_cfg_file)
{
$copy_cfg_file =~ s/my.$cnfext/my-new.$cnfext/;
}
if ( ! $keep_my_cnf ) {
open (TEMPL, $cfg_template) or error($opt, "Could not open config template $cfg_template");
if (open (CFG, "> $copy_cfg_file")) {
while () {
print CFG $_ unless /^# \*\*\*/;
}
close CFG;
} else {
warning($opt,"Could not write to config file $copy_cfg_file: $!");
$failed_write_cfg= 1;
}
close TEMPL;
}
my $cmd;
my @default_options;
if ( $opt->{'defaults-file'} )
{
$cmd = quote_options($print_defaults,
"--defaults-file=$opt->{'defaults-file'}",
"mysqld", "mysql_install_db");
}
else
{
$cmd = quote_options($print_defaults, "mysqld", "mysql_install_db");
}
open(PIPE, "$cmd |") or error($opt,"can't run $cmd: $!");
while ( )
{
chomp;
next unless /\S/;
push(@default_options, $_);
}
close PIPE;
$opt = {};
parse_arguments($opt, @default_options);
parse_arguments($opt, 'PICK-ARGS-FROM-ARGV', @ARGV);
if ( $opt->{'random-passwords'} ) {
if ( $^O =~ m/^(MSWin32|cygwin)$/ ) {
print "Random password not yet implemented for $^O - option will be ignored\n";
delete $opt->{'random-passwords'};
} else {
ensure_secret_file();
my $password = generate_random_password();
if ( $password ) {
$escaped_password = basic_single_escape($password);
} else {
print "Could not generate a random password - not setting one\n";
delete $opt->{'random-passwords'};
}
}
}
my ($bindir,$extra_bindir,$mysqld,$pkgdatadir,$mysqld_opt,$scriptdir);
if ( $opt->{srcdir} )
{
$bindir = "$basedir/client";
$extra_bindir = "$basedir/extra";
$mysqld = "$basedir/sql/mysqld";
$mysqld_opt = "--language=$opt->{srcdir}/sql/share/english";
$pkgdatadir = "$opt->{srcdir}/scripts";
$scriptdir = "$opt->{srcdir}/scripts";
}
elsif ( $opt->{basedir} )
{
$bindir = "$opt->{basedir}/bin";
$extra_bindir = $bindir;
$mysqld = find_in_basedir($opt,"file",["mysqld-nt","mysqld"],
"libexec","sbin","bin") || # ,"sql"
find_in_basedir($opt,"file","mysqld-nt",
"bin"); # ,"sql"
$pkgdatadir = find_in_basedir($opt,"dir","fill_help_tables.sql",
"share","share/mysql"); # ,"scripts"
$scriptdir = "$opt->{basedir}/scripts";
}
else
{
$bindir = './bin';
$extra_bindir = $bindir;
$mysqld = './bin/mysqld';
$pkgdatadir = './share';
$scriptdir = './bin';
}
unless ( $opt->{ldata} )
{
$opt->{ldata} = './data';
}
if ( $opt->{srcdir} )
{
$pkgdatadir = "$opt->{srcdir}/scripts";
}
my $fill_help_tables = "$pkgdatadir/fill_help_tables.sql";
my $create_system_tables = "$pkgdatadir/mysql_system_tables.sql";
my $fill_system_tables = "$pkgdatadir/mysql_system_tables_data.sql";
my $security_commands = "$pkgdatadir/mysql_security_commands.sql";
foreach my $f ( $fill_help_tables, $create_system_tables, $fill_system_tables, $security_commands )
{
-f $f or cannot_find_file($f);
}
-x $mysqld or -f "$mysqld.exe" or cannot_find_file($mysqld);
my $hostname = hostname();
my $resolved;
if ( !$opt->{'cross-bootstrap'} and !$opt->{rpm} and !$opt->{force} )
{
my $resolveip = "$extra_bindir/resolveip";
$resolved = `$resolveip $hostname 2>&1`;
if ( $? != 0 )
{
$resolved=`$resolveip localhost 2>&1`;
if ( $? != 0 )
{
error($opt,
"Neither host '$hostname' nor 'localhost' could be looked up with",
"$resolveip",
"Please configure the 'hostname' command to return a correct",
"hostname.",
"If you want to solve this at a later stage, restart this script",
"with the --force option");
}
warning($opt,
"The host '$hostname' could not be looked up with $resolveip.",
"This probably means that your libc libraries are not 100 % compatible",
"with this binary MySQL version. The MySQL daemon, mysqld, should work",
"normally with the exception that host name resolving will not work.",
"This means that you should use IP addresses instead of hostnames",
"when specifying MySQL privileges !");
}
}
if ( $opt->{'skip-name-resolve'} and $resolved and $resolved =~ /\s/ )
{
$hostname = (split(' ', $resolved))[5];
}
my $parent = dirname ( $opt->{ldata} );
if ( ! -d $parent ) {
error($opt,
"The parent directory for the data directory '$opt->{ldata}' does not exist.",
"If that path was really intended, please create that directory path and then",
"restart this script.",
"If some other path was intended, please use the correct path when restarting this script.");
}
my $opt_user= $opt->{user};
my @pwnam;
if ($opt_user)
{
if ( $^O =~ m/^(MSWin32|cygwin)$/ )
{
warning($opt, "The --user option is not supported on Windows, ignoring");
$opt_user= undef;
}
else
{
@pwnam= getpwnam($opt_user);
}
}
foreach my $dir ( $opt->{ldata}, "$opt->{ldata}/mysql", "$opt->{ldata}/test" )
{
mkdir($dir, 0700) unless -d $dir;
if ($opt_user and -w "/")
{
chown($pwnam[2], $pwnam[3], $dir)
or error($opt, "Could not chown directory $dir");
}
}
push(@args, "--user=$opt->{user}") if $opt->{user};
my $defaults_option = "";
if ( $opt->{'no-defaults'} )
{
$defaults_option= "--no-defaults";
}
elsif ( $opt->{'defaults-file'} )
{
$defaults_option= "--defaults-file=$opt->{'defaults-file'}";
}
my $defaults_extra= "--defaults-extra-file=$opt->{'defaults-extra-file'}"
if $opt->{'defaults-extra-file'};
my $mysqld_bootstrap = $ENV{MYSQLD_BOOTSTRAP} || $mysqld;
my $mysqld_install_cmd_line = quote_options($mysqld_bootstrap,
$defaults_option,
$defaults_extra,
$mysqld_opt,
"--bootstrap",
"--basedir=$basedir",
"--datadir=$opt->{ldata}",
"--log-warnings=0",
"--loose-skip-ndbcluster",
"--max_allowed_packet=8M",
"--default-storage-engine=MyISAM",
"--net_buffer_length=16K",
@args,
);
report_verbose_wait($opt,"Installing MySQL system tables...");
open(SQL, $create_system_tables)
or error($opt,"can't open $create_system_tables for reading: $!");
open(SQL2, $fill_system_tables)
or error($opt,"can't open $fill_system_tables for reading: $!");
# FIXME > /dev/null ?
if ( open(PIPE, "| $mysqld_install_cmd_line") )
{
print PIPE "use mysql;\n";
while ( )
{
next if $opt->{'cross-bootstrap'} and /\@current_hostname/;
print PIPE $_;
}
while ( )
{
next if $opt->{'cross-bootstrap'} and /\@current_hostname/;
print PIPE $_;
}
if ( $opt->{'random-passwords'} )
{
open(SQL3, $security_commands)
or error($opt,"can't open $security_commands for reading: $!");
while ( )
{
s/ABC123xyz/$escaped_password/e ;
print PIPE $_;
}
close SQL3;
tell_root_password();
}
close PIPE;
close SQL;
close SQL2;
report_verbose($opt,"OK");
report_verbose_wait($opt,"Filling help tables...");
open(SQL, $fill_help_tables)
or error($opt,"can't open $fill_help_tables for reading: $!");
if ( open(PIPE, "| $mysqld_install_cmd_line") )
{
print PIPE "use mysql;\n";
while ( )
{
print PIPE $_;
}
close PIPE;
close SQL;
report_verbose($opt,"OK");
}
else
{
warning($opt,"HELP FILES ARE NOT COMPLETELY INSTALLED!",
"The \"HELP\" command might not work properly");
}
report_verbose($opt,"To start mysqld at boot time you have to copy",
"support-files/mysql.server to the right place " .
"for your system");
if ( !$opt->{'cross-bootstrap'} )
{
if ( $opt->{'random-passwords'} ) {
report($opt,
"A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !",
"You will find that password in '$secret_file'.",
"",
"You must change that password on your first connect,",
"no other statement but 'SET PASSWORD' will be accepted.",
"See the manual for the semantics of the 'password expired' flag.",
"",
"Also, the account for the anonymous user has been removed.",
"",
"In addition, you can run:",
"",
" $bindir/mysql_secure_installation",
"",
"which will also give you the option of removing the test database.",
"This is strongly recommended for production servers.",
"",
"See the manual for more instructions.");
} else {
report($opt,
"PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !",
"To do so, start the server, then issue the following commands:",
"",
" $bindir/mysqladmin -u root password 'new-password'",
" $bindir/mysqladmin -u root -h $hostname password 'new-password'",
"",
"Alternatively you can run:",
"",
" $bindir/mysql_secure_installation",
"",
"which will also give you the option of removing the test",
"databases and anonymous user created by default. This is",
"strongly recommended for production servers.",
"",
"See the manual for more instructions.");
}
if ( !$opt->{rpm} )
{
report($opt,
"You can start the MySQL daemon with:",
"",
" cd " . '.' . " ; $bindir/mysqld_safe &",
"",
"You can test the MySQL daemon with mysql-test-run.pl",
"",
" cd mysql-test ; perl mysql-test-run.pl");
}
report($opt,
"Please report any problems at http://bugs.mysql.com/",
"",
"The latest information about MySQL is available on the web at",
"",
" http://www.mysql.com",
"",
"Support MySQL by buying support/licenses at http://shop.mysql.com");
if ($keep_my_cnf)
{
report($opt,
"Note: new default config file not created.",
"Please make sure your config file is current");
}
elsif ($copy_cfg_file eq $config_file and !$failed_write_cfg)
{
report($opt,
"New default config file was created as $config_file and",
"will be used by default by the server when you start it.",
"You may edit this file to change server settings");
}
elsif ($failed_write_cfg)
{
warning($opt,
"Could not copy config file template $cfg_template to",
"$copy_cfg_file, may not have access rights to do so.",
"You may want to copy the file manually, or create your own,",
"it will then be used by default by the server when you start it.");
}
else
{
warning($opt,
"Found existing config file $config_file on the system.",
"Because this file might be in use, it was not replaced,",
"but was used in bootstrap (unless you used --defaults-file)",
"and when you later start the server.",
"The new default config file was created as $copy_cfg_file,",
"please compare it with your file and take the changes you need.");
}
foreach my $cfg ( "/etc/my.$cnfext", "/etc/mysql/my.$cnfext" )
{
check_sys_cfg_file ($opt, $cfg);
}
}
exit 0
}
else
{
error($opt,
"Installation of system tables failed!",
"",
"Examine the logs in $opt->{ldata} for more information.",
"You can try to start the mysqld daemon with:",
"$mysqld --skip-grant-tables &",
"and use the command line tool",
"$bindir/mysql to connect to the mysql",
"database and look at the grant tables:",
"",
"shell> $bindir/mysql -u root mysql",
"mysql> show tables",
"",
"Try 'mysqld --help' if you have problems with paths. Using --log",
"gives you a log in $opt->{ldata} that may be helpful.",
"",
"The latest information about MySQL is available on the web at",
"http://www.mysql.com",
"Please consult the MySQL manual section: 'Problems running mysql_install_db',",
"and the manual section that describes problems on your OS.",
"Another information source is the MySQL email archive.",
"",
"Please check all of the above before submitting a bug report",
"at http://bugs.mysql.com/")
}
sub check_sys_cfg_file
{
my $opt= shift;
my $fname= shift;
if ( -e $fname )
{
warning($opt,
"Default config file $fname exists on the system",
"This file will be read by default by the MySQL server",
"If you do not want to use this, either remove it, or use the",
"--defaults-file argument to mysqld_safe when starting the server");
}
}
sub report_verbose
{
my $opt = shift;
my $text = shift;
report_verbose_wait($opt, $text, @_);
print "\n\n";
}
sub report_verbose_wait
{
my $opt = shift;
my $text = shift;
if ( $opt->{verbose} or (!$opt->{rpm} and !$opt->{'cross-bootstrap'}) )
{
print "$text";
map {print "\n$_"} @_;
}
}
sub report
{
my $opt = shift;
my $text = shift;
print "$text\n";
map {print "$_\n"} @_;
print "\n";
}
sub error
{
my $opt = shift;
my $text = shift;
print "FATAL ERROR: $text\n";
map {print "$_\n"} @_;
exit 1;
}
sub warning
{
my $opt = shift;
my $text = shift;
print "WARNING: $text\n";
map {print "$_\n"} @_;
print "\n";
}
my $_pkgadd_fodder= "
basedir=foo
datadir=bar
";
四、mysql的配置文件my.cnf
其中mysql的配置文件有多个,其中如果配置文件中有相同参数配置,则后面的覆盖前面的。其中参考mysql的安装
其中在my.cnf文件中被分为几个部分
分类 | 详解 |
[client] | mysql客户端:以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。 |
[mysqld] | mysql服务端 |
[mysqld_safe] | |
[mysqldump] | |
[mysql] | |
[isamchk] | |
[myisamchk] | |
[mysqlhotcopy] | |
[mysqld_safe] |
[mysqld]
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
collation-server=utf8_general_ci
symbolic-links=0
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8
[client]
default-character-set = utf8
一份生产环境下的实际配置
适应环境:本配置文件针对Dell R710,双至强E5620、16G内存的硬件配置。CentOS 5.6 64位系统,MySQL 5.5.x 稳定版。适用于日IP 50-100w,PV 100-300w的站点,主要使用InnoDB存储引擎。其他应用环境请根据实际情况来设置优化。
# 以下选项会被MySQL客户端应用读取。
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。
# 如果你想你自己的MySQL应用程序获取这些值。
# 需要在MySQL客户端库初始化的时候指定这些选项。
#
[client]
#password = [your_password]
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# *** 应用定制选项 ***
#
# MySQL 服务端
#
[mysqld]
# 一般配置选项
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现”connection refused” 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log = 300
# 不在TCP/IP端口上进行监听.
# 如果所有的进程都是在同一台服务器连接到本地的mysqld,
# 这样设置将是增强安全的方法
# 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.
# 注意在windows下如果没有打开命名管道选项而只是用此项
# (通过 “enable-named-pipe” 选项) 将会导致mysql服务没有任何作用!
#skip-networking
# MySQL 服务所允许的同时会话数的上限
# 其中一个连接将被SUPER权限保留作为管理员登录.
# 即便已经达到了连接数的上限.
max_connections = 3000
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 “Aborted_connects” 状态来获取全局计数器.
max_connect_errors = 30
# 所有线程所打开表的数量.
# 增加此值就增加了mysqld所需要的文件描述符的数量
# 这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096
table_cache = 4096
# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表
#external-locking
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet = 32M
# 在一个事务中binlog为了记录SQL状态所持有的cache大小
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.
# 此缓冲在每个连接的事务第一次更新状态时被创建
binlog_cache_size = 4M
# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size = 128M
# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序
# 如果排序后的数据无法放入排序缓冲,
# 一个用来替代的基于磁盘的合并分类会被使用
# 查看 “Sort_merge_passes” 状态变量.
# 在排序发生时由每个线程分配
sort_buffer_size = 16M
# 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).
# 类似的联合在极大多数情况下有非常糟糕的性能表现,
# 但是将此值设大能够减轻性能影响.
# 通过 “Select_full_join” 状态变量查看全联合的数量
# 当全联合发生时,在每个线程中分配
join_buffer_size = 16M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中.
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size = 16
# 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值
thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 128M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_limit = 4M
# 被全文检索索引的最小的字长.
# 你也许希望减少它,如果你需要搜索更短字的时候.
# 注意在你修改此值之后,
# 你需要重建你的 FULLTEXT 索引
ft_min_word_len = 8
# 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out
# 此选项对于性能有益
#memlock
# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
default_table_type = MYISAM
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过64K的内存
# 如果你使用你自己的需要大量堆的UDF函数
# 或者你的操作系统对于某些操作需要更多的堆,
# 你也许需要将其设置的更高一点.
thread_stack = 512K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size = 128M
# 打开二进制日志功能.
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.
log-bin=mysql-bin
# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 你需要在服务器B上打开此项.
# 此选项打开在从线程上重做过的更新的日志,
# 并将其写入从服务器的二进制日志.
#log_slave_updates
# 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)
# 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.
#log
# 将警告打印输出到错误log文件. 如果你对于MySQL有任何问题
# 你应该打开警告log并且仔细审查错误日志,查出可能的原因.
#log_warnings
# 记录慢速查询. 慢速查询是指消耗了比 “long_query_time” 定义的更多时间的查询.
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.
# 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,
log_slow_queries
# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.
# 不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).
long_query_time = 6
# 在慢速日志中记录更多的信息.
# 一般此项最好打开.
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
log_long_format
# 此目录被MySQL用来保存临时文件.例如,
# 它被用来处理基于磁盘的大型排序,和内部排序一样.
# 以及简单的临时表.
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好
# 另一种选择是你也可以将其放置在独立的磁盘上.
# 你可以使用”;”来放置多个路径
# 他们会按照roud-robin方法被轮询使用.
#tmpdir = /tmp
# *** 主从复制相关的设置
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间.
# 此值在master和slave上都需要设置.
# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = 1
# 复制的Slave (去掉master段的注释来使其生效)
#
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:
#
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -
# 语法如下:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD= ;
#
# 你需要替换掉 , , 等被尖括号包围的字段以及使用master的端口号替换 (默认3306).
#
# 例子:
#
# CHANGE MASTER TO MASTER_HOST=’125.564.12.1′, MASTER_PORT=3306,
# MASTER_USER=’joe’, MASTER_PASSWORD=’secret’;
#
# 或者
#
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,
# 例如如果你输入错密码在master-password字段并且slave无法连接),
# slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略
# 并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.
# 由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替
#
# 所需要的唯一id号位于 2 和 2^32 – 1之间
# (并且和master不同)
# 如果master-host被设置了.则默认值是2
# 但是如果省略,则不会生效
#server-id = 2
#
# 复制结构中的master – 必须
#master-host =
#
# 当连接到master上时slave所用来认证的用户名 – 必须
#master-user =
#
# 当连接到master上时slave所用来认证的密码 – 必须
#master-password =
#
# master监听的端口.
# 可选 – 默认是3306
#master-port =
# 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only
#*** MyISAM 相关选项
# 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.
# 不要将其设置大于你可用内存的30%,
# 因为一部分内存同样被OS用来缓冲行数据
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.
key_buffer_size = 128M
# 用来做MyISAM表全表扫描的缓冲大小.
# 当全表扫描需要时,在对应线程中分配.
read_buffer_size = 8M
# 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.
# 如果你增高此值,可以提高很多ORDER BY的性能.
# 当需要时由每个线程分配
read_rnd_buffer_size = 64M
# MyISAM 使用特殊的类似树的cache来使得突发插入
# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 “key_buffer_size”.
# 当突发插入被检测到时此缓冲将被分配.
bulk_insert_buffer_size = 256M
# 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.
# 这在每个线程中被分配.所以在设置大值时需要小心.
myisam_sort_buffer_size = 256M
# MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 10G
# 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.
myisam_max_extra_sort_file_size = 10G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1
# 自动检查和修复没有适当关闭的 MyISAM 表.
myisam_recover
# 默认关闭 Federated
skip-federated
# *** BDB 相关选项 ***
# 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.
skip-bdb
# *** INNODB 相关选项 ***
# 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分
#skip-innodb
# 附加的内存池被InnoDB用来保存 metadata 信息
# 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.
# SHOW INNODB STATUS 命令会显示当先使用的数量.
innodb_additional_mem_pool_size = 64M
# InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,
# 所以不要设置的太高.
innodb_buffer_pool_size = 6G
# InnoDB 将数据保存在一个或者多个数据文件中成为表空间.
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.
# 其他情况下.每个设备一个文件一般都是个好的选择.
# 你也可以配置InnoDB来使用裸盘分区 – 请参考手册来获取更多相关内容
innodb_data_file_path = ibdata1:10M:autoextend
# 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.
# 默认保存在MySQL的datadir中.
#innodb_data_home_dir =
# 用来同步IO操作的IO线程的数量. This value is
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.
innodb_file_io_threads = 4
# 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.
# 从1开始并且增加此值知道你能够成功的导出表.
#innodb_force_recovery=1
# 在InnoDb核心内的允许线程数量.
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.
# 过高的值可能导致线程的互斥颠簸.
innodb_thread_concurrency = 16
# 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,
# 这提供了完整的ACID行为.
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.
innodb_flush_log_at_trx_commit = 2
(说明:如果是游戏服务器,建议此值设置为2;如果是对数据安全要求极高的应用,建议设置为1;设置为0性能最高,但如果发生故障,数据可能会有丢失的危险!默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。)
# 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.
# 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.
#innodb_fast_shutdown
# 用来缓冲日志数据的缓冲区的大小.
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)
innodb_log_buffer_size = 16M
# 在日志组中每个日志文件的大小.
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.
innodb_log_file_size = 512M
# 在日志组中的文件总数.
# 通常来说2~3是比较好的.
innodb_log_files_in_group = 3
# InnoDB的日志文件所在位置. 默认是MySQL的datadir.
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能
#innodb_log_group_home_dir
# 在InnoDB缓冲池中最大允许的脏页面的比例.
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.
# 这是一个软限制,不被保证绝对执行.
innodb_max_dirty_pages_pct = 90
# InnoDB用来刷新日志的方法.
# 表空间总是使用双重写入刷新方法
# 默认值是 “fdatasync”, 另一个是 “O_DSYNC”.
#innodb_flush_method=O_DSYNC
# 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎
# 那么一个死锁可能发生而InnoDB无法注意到.
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.
innodb_lock_wait_timeout = 120
[mysqldump]
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项
quick
max_allowed_packet = 32M
[mysql]
no-auto-rehash
# 仅仅允许使用键值的 UPDATEs 和 DELETEs .
#safe-updates
[isamchk]
key_buffer = 2048M
sort_buffer_size = 2048M
read_buffer = 32M
write_buffer = 32M
[myisamchk]
key_buffer = 2048M
sort_buffer_size = 2048M
read_buffer = 32M
write_buffer = 32M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
# 增加每个进程的可打开文件数量.
# 警告: 确认你已经将全系统限制设定的足够高!
# 打开大量表需要将此值设大
open-files-limit = 8192