2-MySQL DBA笔记-MySQL安装部署和入门

时间:2022-05-29 23:52:06

第2章 MySQL安装部署和入门
第1章介绍了MySQL的一些基础知识,本章将为读者介绍MySQL的部署、安装及一些常用命令和参数的设置。
2.1 如何选择MySQL版本
在选择MySQL的版本时,要根据生产情况来决定,是对现有生产环境中的数据库进行版本升级呢?还是部署新的数据库呢?
如果已经在生产环境中部署了MySQL,那么我们不需要急着将其升级到最新版本,旧的版本已经在生产环境中长期稳定地运行,而新版本刚出来时,往往并不是那么稳定,通常都会有一些Bug需要修复。
不稳定版本将导致生产系统的不稳定,所以,如果不是急需新版本的某种特性,或者旧版本有严重的安全隐患,建议继续使用旧的MySQL版本即可。
如果新版本已经稳定成熟且生产环境中的版本过于陈旧,那么可以考虑升级旧的MySQL版本。
MySQL的发展已经有10多年了,截至2016年6 月,Oracle已经发布了MySQL 5.5、MySQL 5.6、MySQL 5.7,其中MySQL 5.5已经比较成熟,读者可以考虑把生产环境中的 MySQL 5.0和MySQL 5.1升级到MySQL 5.5,如果需要MySQL 5.6的一些新特性,那么可以考虑将非核心的一些系统升级到 MySQL 5.6。
升级到新版本,往往可以获得一定程度上的性能提升,所以,有计划地把生产环境中的MySQL 5.0、MySQL 5.1系统升级为最新的稳定成熟版本是值得的。
如果升级的代价比较大,那么保持现状也是可以的。
如果生产数据库的部署是标准的,那么可以考虑编写一个自动升级的脚本。先统一升级从库,再升级主库。
由于升级主库可能对服务的可用性造成影响,因此需要和相关方协调好时间计划。
如果前端有带数据库自动切换功能的中间件,或者应用层能够比较友好地处理主从切换,那么把数据库流量临时切换到从库,可以大大减少对生产服务的影响。
对MySQL的分支选择也要慎重,2008年SUN公司收购了MySQL AB,但次年Oracle又收购了SUN,MySQL也是交易的一部分,
这之后,Oracle的一系列举动让许多用户和开发者开始质疑MySQL在Oracle旗下的命运,进而开始选择其他替代品。
对于 MySQL分支的选择,本书不做过多的叙述,现实中,已经有一些重量级公司放弃了MySQL,转向MySQL的其他分支,如 MariaDB、Percona Server,
但对于绝大部分中小公司来说,使用官方的MySQL或其他分支(如MariaDB),都是比较好的选择, 能够满足绝大部分的需求。
笔者的建议是如果公司尚在起步阶段,选择Oracle官方的版本即可。
我们选择一个产品往往会基于 一个重要的理由,它必须是由一个可靠的、成熟的公司或组织来维护的,这能够确保这个产品会得到长久、稳定的支持。
技术发展的目的是解放生产力,如果官方版本仍然能够为企业带来好处,那么坚持使用原来的产品往往是一种比较好的选择,
开源和闭源的分裂将是长期的,也是可以共存的,只要是对企业有利的,就不应该拒绝继续使用,除非你有明确的理由放弃它。

2.2 官方版本的安装
下面将以Linux下MySQL 5.1和MySQL 5.5的安装为例进行讲解。
为了避免冲突,可以考虑先卸载Linux下自带的MySQL安装包,可使用“rpm-qa | grep MySQL”检测是否安装了MySQL相关包。
推荐大家使用二进制版本的安装,主要原因是简单方便,而且官方的二进制包也是经过了充分的测试验证和参数优化的。
使用源代码编译的方式安装可能会有一定性能的提升,但在实际应用中,可能会由于编译源码而出现各种问题,如果不清楚编译的参数,建议还是使用二进制版本。
此外,无论是使用二进制版本还是源码编译,大规模的部署都必须尽量做到自动化安装,否则安装部署的成本会比较高。
2.2.1 二进制包的安装
首先登录官网,下载二进制版本,步骤如下。
1)进入www.mysql.com。
2)选择downloads(GA)。
3)单击Download from MySQL Developer Zone。
4)单击MySQLCommunity Server。
5)选择相应的平台、版本,比如,选择64位Linux平台下的MySQL二进制包“Linux-Generic(glibc 2.5)(x86,64- bit),Compressed”。
下面开始二进制版本的安装。
1.在root下安装MySQL
这种安装方式为默认方式,这里以“mysql-5.1.45-linux-x86_64-icc-glibc23.tar.gz”为例进行讲解。
以root身份登录,运行如下命令安装MySQL。
useradd mysql
cd /usr/local
tar zxvf /tmp/mysql-5.1.45-linux-x86_64-icc-glibc23.tar.gz
ln -s mysql-5.1.45-linux-x86_64-icc-glibc23 mysql
cd mysql
cp support-files/my-large.cnf /etc/my.cnf
chown -R mysql .
chgrp -R mysql .
scripts/mysql_install_db --user=mysql
chown -R root .
chown -R mysql data
mv data /home/mysql/
ln -s /home/mysql/data .
上面的命令中移动data目录到其他分区(/home/mysql),是因为/usr/local下的磁盘空间可能不够。
一般数据目录会存放到和操作系统不一样的分区或磁盘中。
下面是安装后的目录及文件说明。
安装后在安装目录mysql/bin中有如下内容。
·mysqld:MySQL服务主程序。
·mysqld_safe:MySQL服务启动脚本。
·mysql:MySQL命令行工具。
·mysqladmin:MySQL客户端(管理数据库)。
·perror:显示错误码(状态码)含义。
·mysqlbinlog:是处理二进制日志文件的实用工具。
将MySQL配置为自启动服务,并启动。
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig mysqld on
/etc/init.d/mysqld start
运行如下命令设置MySQL root密码。
/usr/local/mysql/bin/mysqladmin -u root password 'your_password'
之后,使用MySQL自带的脚本或手动执行命令强化安全,删除匿名用户。
自动化的方式是在root用户下执行如下命令。
./bin/mysql_secure_installation
然后按照提示操作,删除匿名账户和空密码的账户。
手动删除匿名账户的操作方法如下。
shell> mysql -u root
mysql> DELETE FROM mysql.user WHERE User = '';
mysql> FLUSH PRIVILEGES
说明:如果要手动修改授权表(使用INSERT、UPDATE或DELETE等),应该在mysql命令提示符下执行FLUSH PRIVILEGES或mysqladmin flush-privileges告诉服务器再装载授权表,否则更改将不会生效。
建议使用/usr/bin/mysql_secure_installation脚本进行安全配置,它会帮你删除匿名账号。
安装完成后,注意把要执行命令的路 径添加到系统的PATH变量里,命令如下。
vi ~
mysql/.bash_profile
export PATH=/usr/local/mysql/bin:$PATH
2.安装在特定的用户下面
首先,编辑一份自己的配置文件,指定PORT、SOCKET等参数变量。
安装和启动的时候需要指定这个配置文件,其他操 作和默认安装类似。
比如,要安装到“$HOME/app/”下,命令如下。
cd $HOME/app
tar zxvf /path/mysql-5.1.45-linux-x86_64-icc-glibc23.tar.gz
ln -s mysql-5.1.45-linux-x86_64-icc-glibc23 mysql
cd mysql
scripts/mysql_install_db --defaults-file=/home/garychen/app/mysql/my.cnf --user=garychen
如果配置文件没有指定数据目录的话,则默认是在/home/garychen/app/mysql/data下。
启动方式如下:
./bin/mysqld_safe --defaults-file=/home/garychen/app/mysql/my.cnf --user=garychen &
注意:defaults-file参数必须作为第一个参数。
此外,如果是生产环境下的大批量部署,一般建议定制自己的自动化安装脚本,或者通过自动化平台安装。
2.2.2 源码编译安装
本书不建议一般使用者使用源码编译的方式进行安装,如果决定编译安装,最好想想是否真的值得这样做,它可能对于性能提升并无多大作用,但却可能会带来潜在的不稳定因素,
你必须确保自己对某些编译选项很熟悉,因为许多生产问题都来自于错误的编译方式。
可采用如下的命令查看已经安装的MySQL编译选项。
cat /usr/local/mysql/bin/mysqlbug | grep CONFIGURE_LINE
下面以MySQL 5.5为例讲解源码编译安装的基本步骤。
1)下载“MySQL-5.5.33.tar.gz”。
2)确认系统已经安装了cmake。
3)编译安装MySQL,命令如下。
# 创建运行 MySQL的用户
shell> groupadd mysql
shell> useradd -r -g mysql mysql
# 开始编译安装
shell> tar zxvf mysql-VERSION.tar.gz
shell> cd mysql-VERSION
shell> cmake . -LH # overview with help text
shell> cmake .
shell> make-j 8
shell> make install
# 安装后配置、初始化数据库
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
#启动 MySQL Server
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> bin/mysqld_safe --user=mysql &
#添加到自启动服务
shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell>chkconfig mysql.server on
#设置 root密码
/usr/local/mysql/bin/mysqladmin -u root password 'your_password'
#类似二进制安装,还需要进行安全强化,运行
./bin/mysql_secure_installation

2.3 其他MySQL分支的安装
一些其他MySQL的分支,提供了更高的性能和更多的特性,如Percona Server、MariaDB等,它们的二进制版本安装类似于官方版本,读者可参考对应分支的安装文档进行部署安装。
注意,安装前一定要仔细阅读它们的安装文档。

2.4 安装InnoDB Plugin
对于MySQL 5.0、MySQL 5.1版本,有时我们可能会想要安装InnoDB Plugin,因为它较之Built-in版本新增了一些特性。
而且 一些性能测试也表明,InnoDB Plugin的性能、伸缩性明显优于MySQL 5.1里内置的InnoDB。
不过,在这么做之前要先留意一下不同的InnoDB Plugin版本和MySQL版本的兼容性。
对于源代码编译的MySQL,一般可以用编译的InnoDB代替内建的InnoDB,但是二进制版本的InnoDB插件通常只适用于特定的MySQL版本。
使用二进制版本安装启用InnoDB Plugin的具体步骤如下。
1)确认MySQL没有在运行。如果正在运行,那么应该先设置变量innodb_fast_shutdown。
SET GLOBAL innodb_fast_shutdown=0; 然后再关闭数据库(对于大数据库而言,可能耗时会较多)。
2)在参数文件[mysqld]节中增加以下参数。
shell>vi my.cnf
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so
plugin_dir=/usr/local/mysql/lib/plugin
3)启动数据库,启动数据库后执行下面的语句。
INSERT INTO mysql.plugin VALUES('INNODB', 'ha_innodb_plugin.so') ;
INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_TRX SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_LOCKS SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_LOCK_WAITS SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_CMP SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_CMP_RESET SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_CMPMEM SONAME 'ha_innodb_plugin.so';
INSTALL PLUGIN INNODB_CMPMEM_RESET SONAME 'ha_innodb_plugin.so';
4)关闭数据库,然后再去掉参数文件my.cnf中的plugin-load和plugin_dir行,之后重新启动数据库,运行“SELECT @@innodb_version;”以确认版本。

2.5 常用命令
本节先介绍几个常用命令,如mysql、mysqladmin、mysqldump的简单用法。后续章节还会再详述这些命令的使用。
2.5.1 使用mysql命令
首先,需要留意区分MySQL的大小写。标准的说法是,MySQL指MySQL服务器,mysql指客户端。
从Unix/Linux系统下发展出来的MySQL有着优良的设计,客户工具的所有选项都可以保存到一个“~/.my.cnf”的用户级配置文件里的[client]部分中,而且它把适用于MySQL的选项集中在了[MySQL]部分。
可以先把默认的用户名、密码、端口等 在“.my.cnf”文件中配置好,以便简化登录。
另外,要说明一下,本章阐述的一些命令,为了显示方便,可能会省略用户名、密码、socket文件的功能连接参数。
首先给出连接并登录数据库时会涉及的命令,分别如下。
通过IP、端口远程连接的命令:mysql -h ip_address -P your_port -u username -p
通过TCP/IP协议进行本地连接的命令:mysql -u username -h 127.0.0.1 -P your_port
通过socket文件进行本地连接的命令: mysql -u username -S /path/to/mysql.sock
阅读在线帮助的命令:mysql> help contents
退出的命令:mysql > exit
简单查询的命令:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> SELECT SIN(PI()/4), (4+1)*5;
MySQL客户端还提供了一些简写命令,这些简写命令只能出现在命令行的中间或末尾,具体如下。
mysql> help
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
ego (\G) Send command to MySQL server, display result vertically.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
edit (\e) Edit command with $EDITOR.
下面来看一个示例。
mysql> pager cat > /tmp/log.txt
mysql> pager less -n -i -S -F
命令less的“-S”选项可以让你用方向键进行浏览,这对于长行的显示很有用。其中的参数说明分别如下。
-i:搜索时忽略大小写,但如果搜索的字符串中包含大写字母,那么这个选项不起作用。
-n:禁用行号功能,加速浏览大文件。
-F:如果屏幕可以显示的话,就直接退出。
使用以下命令,不仅可以将结果输出到屏幕上,还可以通过tee命令记录到文件中。
mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
使用如下命令,会列出所有可见的数据库:mysql> SHOW DATABASES;
切换到test数据库时的命令如下:mysql> USE test #如果有许多表,使用 use db_name可能会比较慢,可以使用 mysql – A进行加速
显示当前数据库的命令如下:mysql> SELECT DATABASE();
创建数据库menagerie的命令如下:MySQL > CREATE DATABASE menagerie;
删除数据库的命令如下:mysql> DROP DATABASE IF EXISTS menagerie;
创建用户,并赋予其对menagerie库的权限的命令如下:mysql> GRANT select,insert,update,delete ON menagerie.* TO 'your_name' @ 'your_client_host';
列出当前数据库下所有表的命令如下:mysql> SHOW TABLES; 或 mysql>SHOW FULL TABLES; #多了第二列,用于显示Table_type
查看表结构的命令如下:mysql>DESC pet;
输入表名、列名等信息时,可以按TAB键补全,“-A”可关闭这个功能。
创建表的命令如下:CREATE TABLE shop ( article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, dealer CHAR(20) DEFAULT '' NOT NULL, price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY(article, dealer));
插入初始化数据的命令如下:INSERT INTO shop VALUES (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45), (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
查询数据的命令如下: SELECT * FROM shop;
执行SQL文件的3种方式如下:
mysql -e "source batch-file"
mysql -h host -u user -p < batch-file
mysql> source /path/filename;
如果有长的屏幕输出,可以转储到文本或使用more进行查看:
mysql < batch-file | more
mysql < batch-file > mysql.out
表2-1针对mysql客户端的提示给出了解释。
如果输入错了,需要清除当前的输入字符,可输入\c来实现。
在如下示例中,少输入了单引号,我们使用\c清除所有的输入字符,回到提示符下。
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30; '> '\c #注意在 \c前还需要输入单引号 '
mysql>
修改用户密码的命令如下:mysql> SET PASSWORD FOR user_name@ip_address = password('1234');
显示当前连接、客户端、数据库字符集等信息的命令如下:mysql> STATUS;
显示mysql支持的排序方式的命令如下:mysql> show collation;
下面的命令将展示前一条命令的警告信息:mysql> show warnings;
展示可用引擎的命令如下:mysql> show engines;
查看存储引擎的变量值:mysql> show variables like 'have%';
SHOW命令的精确输出将随所使用的MySQL版本(和启用的特性)的不同而有变化。第2列的值表示各特性支持的级别, 如表2-2所示。
如下命令可得到表的引擎(engine)。
mysql> USE information_schema;
mysql> SELECT table_name,engine FROM information_schema.tables WHERE table_schema = 'Your Database Name';
如下命令可查看当前连接和服务器的事务隔离模式:SELECT @@tx_isolation,@@global.tx_isolation;
如下命令可查询是否自动提交事务:SELECT @@autocommit;
如下命令可用于查询sql_mode:select @@sql_mode;
如下命令可用于查询存储过程、函数:select routine_schema, routine_name, sql_mode from information_schema.routines;
如下命令可用于查询触发器:select event_object_schema, event_object_table, trigger_name, sql_mode from information_schema.triggers;
也可以通过设置OS环境变量的方式来改变连接的socket文件和TCP端口,命令如下。
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
2.5.2 使用mysqladmin命令
在使用mysqladmin命令时,如下命令可显示参数设置:mysqladmin -p variables | grep log_queries_not_using_indexes
设置root密码的命令如下:myaqladmin -u root -p password "new password"
如下命令可显示状态变量,一般使用-r参数显示两次命令执行期间的增量值:mysqladmin extended-status -uroot -r -i 10
其中,“extended-status”显示的是服务器状态变量和值。-r:显示当前状态变量和上一次运行命令状态变量的差值。-i:重复执行命令的间隔时间。
如下命令可显示当前连接的线程:mysql> show processlist;
如下命令可用于关闭数据库:mysqladmin shutdown
2.5.3 使用mysqldump命令
在使用mysqldump命令时,如下命令可用于备份数据库:mysqldump -uroot --hex-blob db_name > db_name.sql
增加压缩功能的命令如下:mysqldump -uroot --hex-blob db_name | gzip > db_name.sql.gz
也可以使用如下mysql命令恢复数据。 mysql < db_name.sql

2.6 MySQL的主要参数设置
研发、测试人员往往熟悉SQL语句的撰写、表结构的设计,而不熟悉MySQL的配置,这可能会导致一些困惑,比较常见的是,在线上运行良好的查询,到了线下就变慢了,下面介绍几个常见的参数配置。
一般情况下,配置好这几个参数可以满足大部分开发环境和测试环境的要求。
(1)innodb_buffer_pool_size
为了提升写性能,可以把要写的数据先在缓冲区(buffer)里合并,然后再发送给下一级存储。这样做可提高I/O操作的效率。
InnoDB Buffer Pool就是InnoDB用来缓存它的数据和索引的内存缓冲区,可由innodb_buffer_pool_size设置其大小。
理论上,将这个值设置得越高,访问数据需要的磁盘I/O就越少。常见的做法是让这个值大于热点数据,这样可以获得比较好的性能。
如果不清楚环境的数据量和访问模式,建议将其设置为机器物理内存大小的70%~80%。
(2)innodb_log_file_size
日志组里每个日志文件的大小。在32位计算机上日志文件的合并大小必须小于4GB,默认大小是5MB,在生产环境下,这个值太小了。
官方文档推荐的值为从1MB到1/N的缓冲池大小,其中N是日志组里日志文件的数目(由innodb_log_files_in_group变量来确定,一般默认为2)。
值越大,在缓冲池中需要检查点刷新的行为就越少,因此也越节约磁盘I/O,但更大的日志文件也意味着在崩溃时恢复得更慢。
建议将日志文件的大小设置为256MB或更大,这样可以满足一般情况下的需要。
(3)innodb_flush_log_at_trx_commit,这个选项的默认值是1,建议设置为2 。
当设置为2时,在每个事务提交时,日志缓冲被写到文件中,但不对日志文件做刷新到磁盘的操作。对日志文件的刷新每秒才发生一次。
所以,理论上,操作系统崩溃或掉电只会丢失最后一秒的事务。
(4)sync_binlog,建议设置为0
如果是autocommit模式,那么每执行一个语句就会向二进制日志写入一次,否则每个事务写入一次。
如果sync_binlog的值为正,那么每当sync_binlog参数设定数值的语句或事务数被写入二进制日志后,MySQL服务器就会将它的二进制日志同步到硬盘上。
默认值是0,不与硬盘同步。值为1是最安全的选择,因为崩溃时,你最多丢掉二进制日志中的一个语句或事务。但是,这也是最慢的选择,成本昂贵。
另外,在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多 个,取决于存储引擎)。
因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。
大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写则不敏感。
我们应设置变量lower_case_table_names=0,这也是Unix/Linux系统的默认值。
开发环境、测试环境的MySQL也建议部署在Unix/Linux平台,尽可能和生产环境一致。

小结:
本章介绍了如何在生产环境中部署MySQL,一般情况下,掌握二进制版本的安装即可,
本章也介绍了几个常用的命令mysql、mysqladmin、mysqldump,这些命令的选项较多,全部掌握不太现实,但对它们的常用用法应该熟悉。