安装并配置MySQL数据库
如果读者没有物理服务器环境,则可以搭建vmware等虚拟机环境学习,相应地则需准备如下内容:
1)请提前加大VM虚拟机硬件的内存,这样编译时候会更快,最好设置2GB以上的内存。
2)最好提前下载好要安装的MySQL相关软件包(http://mirrors.sohu.com/mysql/)。
3)重视每个操作过程的输出,有错误要解决掉再继续,不能忽略掉操作中的错误(error)。
4)建议进入虚拟机界面去执行make以及make install,通过SSH操作有时会导致网络中断。
有关vmware虚拟化学习软件和CentOS6操作系统的安装详细步骤见《跟老男孩学Linux运维:Web集群实战》,或看免费部署文章:http://book.51cto.com/art/201605/510756.htm。
当前的Linux系统环境情况如下:
[root@oldboy~]# cat /etc/redhat-release#<==操作系统版本
CentOSrelease 6.8 (Final)
[root@oldboy~]# uname -r#<==内核版本
2.6.32-642.el6.x86_64
[root@oldboy~]# uname -m
x86_64 #<==64位系统
(1)安装MySQL需要的依赖包
安装MySQL之前,最好先安装MySQL需要的依赖包,不然后面会出现很多报错信息,到那时还得再回来安装MySQL的依赖包。安装命令如下:
[root@oldboy~]# yum install ncurses-devel libaio-devel -y
[root@oldboy~]# rpm -qa ncurses-devel libaio-devel
ncurses-devel-5.7-4.20090207.el6.x86_64
libaio-devel-0.3.107-10.el6.x86_64
提示:安装后使用rpm -qa ncurses-devel libaio-devel命令检查,如果出现两行如上信息表示安装成功。
(2)安装编译MySQL需要的软件
由于MySQL5.5及以上的系列产品要采用特殊的编译方式安装,因此,需要先安装常用的编译MySQL的工具cmake软件包,命令为:
[root@oldboy~]# yum install cmake -y
[root@oldboy~]# rpm -qa cmake
cmake-2.8.12.2-4.el6.x86_64
提示:安装后使用rpm-qa cmake检查,如果出现一行如上信息表示安装成功。
此外,也有网友采用源码包的方式安装cmake的,但比较复杂,因此一般建议读者选择这个简单的yum安装方法。
为了让大家学习更多的MySQL技术,本文选择了相对复杂的源代码安装方式为例来讲解MySQL多实例安装,大型公司一般都会将MySQL软件定制成rpm包,然后放到yum仓库里,使用yum安装,中小企业里的二进制和编译安装的区别不大。
使用二进制方式安装MySQL方法见http://oldboy.blog.51cto.com/2561410/1893734。
首先以root身份登录到Linux系统中,然后执行如下命令创建mysql用户账号:
[root@oldboy~]# useradd -s /sbin/nologin -M mysql#<==默认会创建和mysql用户同名的组。
[root@oldboy~]# id mysql
uid=500(mysql)gid=500(mysql) groups=500(mysql)
根据上述结果输出,可以看到mysql用户和组已经成功创建。
MySQL软件包的下载地址为:http://dev.mysql.com/downloads/mysql/(如果地址变更无法下载,可以去http://mirrors.sohu.com/mysql下载)。可以把软件下载到客户端电脑本地后,使用rz等工具传到Linux里,或者找到网络下载地址后,直接在Linux里使用wget下载。
提示:本例以MySQL编译的方式来讲解,使用二进制方式安装的完整过程在本文结尾会提供给大家。在生产场景中,二进制和源码包两种安装方法都是可以用的,其应用场景一般没什么太大差别。不同之处在于,二进制的安装包较大,名字和源码包也有些区别,二进制的安装过程比源码更快。
MySQL源码包和二进制安装包的名称见表3-1。
表3-1MySQL二进制和源码包
MySQL软件软件名
MySQL源码安装包mysql-5.6.34.tar.gz(本章选择的安装包)
MySQL二进制安装包mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz
配置及编译安装的步骤如下:
第一步,下载mysql软件包。
[root@oldboy~]# mkdir -p /home/oldboy/tools
[root@oldboy~]# cd /home/oldboy/tools/
[root@oldboytools]# wget -qhttp://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.34.tar.gz
[root@oldboytools]# ls -lh
total31M
-rw-r--r--.1 root root 31M Nov 28 07:46 mysql-5.6.34.tar.gz
第二步,解压配置mysql,命令如下:
[root@oldboytools]# tar xf mysql-5.6.34.tar.gz
[root@oldboytools]# cd mysql-5.6.34
[root@oldboytools]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
-DMYSQL_DATADIR=/application/mysql-5.6.34/data\
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock\
-DDEFAULT_CHARSET=utf8\
-DDEFAULT_COLLATION=utf8_general_ci\
-DWITH_EXTRA_CHARSETS=all\
-DWITH_INNOBASE_STORAGE_ENGINE=1\
-DWITH_FEDERATED_STORAGE_ENGINE=1\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1\
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1\
-DWITH_ZLIB=bundled\
-DWITH_SSL=bundled\
-DENABLED_LOCAL_INFILE=1\
-DWITH_EMBEDDED_SERVER=1\
-DENABLE_DOWNLOADS=1\
-DWITH_DEBUG=0
提示:
1)编译时可配置的选项很多,常见的参数选项见本章最后一部分内容,更详细的可参考本章结尾附录讲解。
2)编译MySQL需要安装gcc等工具,此部分在安装操作系统时已经安装上了,具体参考CentOS6操作系统的安装详细步骤,见《跟老男孩学Linux运维:Web集群实战》书或免费部署文章http://book.51cto.com/art/201605/510756.htm。
第三步,编译安装MySQL,命令如下:
[root@oldboymysql-5.6.34]# make#<==如果是多核cpu,可指定make -jcpu核数,加快编译速度。
[root@oldboymysql-5.6.34]# make install
第四步,为MySQL安装路径设置不带版本号的软链接/application/mysql,操作命令如下:
[root@oldboymysql-5.6.34]# ln -s /application/mysql-5.6.34/ /application/mysql
#补充:如果系统里有曾经安装的数据库文件和启动程序最好停掉或删除,以免冲突。
[root@oldboymysql-5.6.34]# ls -l /application/
total 4
lrwxrwxrwx. 1 root root 26 Feb 26 17:49mysql-> /application/mysql-5.6.34/
drwxr-xr-x.13 root root 4096 Feb 26 17:49 mysql-5.6.34
[root@oldboymysql-5.6.34]# ls /application/mysql/
bin COPYING data docs include lib man mysql-test README scripts share sql-bench support-files
如果上述操作未出现错误(每个步骤结束后,都可以使用echo $?看返回值是否为0,为0则表示正确),查看/application/mysql/目录,若其下有内容,则表示MySQL5.6.34源代码包采用cmake方式安装成功了。
MySQL5.5数据库默认为用户提供了多个配置文件模板,但是MySQL5.6的support-files目录下已经没有配置文件模板了。
[root@oldboymysql-5.6.34]# ll support-files/*.cnf
-rw-r--r--.1 root root 1126 Feb 26 17:54 support-files/my-default.cnf
[root@oldboymysql-5.6.34]# mv /etc/my.cnf /etc/my.cnf.bak
#提示:在CentOS6.8版操作系统最小化安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
#在启动MySQL服务时,会按照一定的顺序搜索my.cnf,先在/etc目录下找,找不到则会搜索"$basedir/my.cnf",在本例中就是/application/mysql-5.6.34/my.cnf,这是新版MySQL的配置文件的默认位置!
[root@oldboymysql-5.6.34]# cp support-files/my-default.cnf /application/mysql-5.6.34/my.cnf
提示:此行操作可以省略,在下文初始化mysql时会自动生成my.cnf模板文件,如果已经执行上述命令,则初始化后会生成my-new.cnf文件,my.cnf和my-new.cnf除了注释以外是一致的。
[root@oldboymysql-5.6.34]# chown -R mysql.mysql /application/mysql/
#<==授权mysql用户管理mysql的安装目录。
关于更多mysql my.cnf参数的说明及调优,请参看本书后面章节。
上述配置完毕后,就可以初始化数据库文件了,这个步骤其实也可以在编译安装MySQL之后就操作,只不过放到这里更合理一些。
(1)初始化MySQL数据库
初始化数据库的核心命令为:
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/--datadir=/application/mysql/data --user=mysql
提示:--basedir=/application/mysql/为MySQL的安装路径,--datadir为数据文件目录。另,注意mysql_install_db和MySQL5.1的路径不同,MySQL5.1不在MySQL bin路径下了。
整个初始化的操作过程为:
[root@oldboy mysql-5.6.34]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/--datadir=/application/mysql/data --user=mysql
#<==初始化mysql数据库文件,会有很多信息提示,如果没有ERROR级别的错误,有两个OK的字样,表示初始化成功,否则就要解决初始化的问题。
InstallingMySQL system tables...2017-02-26 18:08:53 0 [Warning] TIMESTAMP with implicitDEFAULT value is deprecated. Please use --explicit_defaults_for_timestampserver option (see documentation for more details).
2017-02-2618:08:53 0 [Note] Ignoring --secure-file-priv value as server is running with--bootstrap.
2017-02-2618:08:53 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.34) starting asprocess 47993 ...
2017-02-2618:08:53 47993 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-02-2618:08:53 47993 [Note] InnoDB: The InnoDB memory heap is disabled
2017-02-2618:08:53 47993 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-02-2618:08:53 47993 [Note] InnoDB: Memory barrier is not used
2017-02-2618:08:53 47993 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-02-2618:08:53 47993 [Note] InnoDB: Using Linux native AIO
2017-02-2618:08:53 47993 [Note] InnoDB: Using CPU crc32 instructions
2017-02-2618:08:53 47993 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2017-02-2618:08:53 47993 [Note] InnoDB: Completed initialization of buffer pool
2017-02-2618:08:53 47993 [Note] InnoDB: The first specified data file ./ibdata1 did notexist: a new database to be created!
2017-02-2618:08:53 47993 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB
2017-02-2618:08:53 47993 [Note] InnoDB: Database physically writes the file full: wait...
...省略若干...
2017-02-2618:08:54 47993 [Note] InnoDB: Waiting for purge to start
2017-02-2618:08:54 47993 [Note] InnoDB: 5.6.34 started; log sequence number 0
2017-02-2618:08:54 47993 [Note] Binlog end
2017-02-2618:08:54 47993 [Note] InnoDB: FTS optimize thread exiting.
2017-02-2618:08:54 47993 [Note] InnoDB: Starting shutdown...
2017-02-2618:08:55 47993 [Note] InnoDB: Shutdown completed; log sequence number 1625977
OK#<==两个OK是初始化成功的标志。
Fillinghelp tables...2017-02-26 18:08:55 0 [Warning] TIMESTAMP with implicit DEFAULTvalue is deprecated. Please use --explicit_defaults_for_timestamp server option(see documentation for more details).
2017-02-2618:08:55 0 [Note] Ignoring --secure-file-priv value as server is running with--bootstrap.
2017-02-2618:08:55 0 [Note] /application/mysql//bin/mysqld (mysqld 5.6.34) starting asprocess 48015 ...
2017-02-2618:08:55 48015 [Note] InnoDB: Using atomics to ref count buffer pool pages
2017-02-2618:08:55 48015 [Note] InnoDB: The InnoDB memory heap is disabled
...省略若干...
2017-02-2618:08:56 48015 [Note] InnoDB: FTS optimize thread exiting.
2017-02-2618:08:56 48015 [Note] InnoDB: Starting shutdown...
2017-02-2618:08:57 48015 [Note] InnoDB: Shutdown completed; log sequence number 1625987
OK#<==两个OK是初始化成功的标志。
To startmysqld at boot time you have to copy
support-files/mysql.serverto the right place for your system
PLEASEREMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To doso, start the server, then issue the following commands:
/application/mysql//bin/mysqladmin-u root password 'new-password'
/application/mysql//bin/mysqladmin-u root -h oldboy password 'new-password'
Alternativelyyou can run:
/application/mysql//bin/mysql_secure_installation
whichwill also give you the option of removing the test
databasesand anonymous user created by default. This is
stronglyrecommended for production servers.
See themanual for more instructions.
You canstart the MySQL daemon with:
cd . ;/application/mysql//bin/mysqld_safe &
You cantest the MySQL daemon with mysql-test-run.pl
cdmysql-test ; perl mysql-test-run.pl
Pleasereport any problems at http://bugs.mysql.com/
Thelatest information about MySQL is available on the web at
http://www.mysql.com
SupportMySQL by buying support/licenses at http://shop.mysql.com
###请注意如下几行英文的说明
New default config file was createdas /application/mysql//my.cnf and
will be used by default by theserver when you start it.
You may edit this file to changeserver settings
#从上文说明中可以指导mysql的默认配置文件已经变到了/application/mysql//my.cnf
WARNING: Default config file/etc/my.cnf exists on the system
This file will be read by defaultby the MySQL server
If you do not want to use this,either remove it, or use the
--defaults-file argument tomysqld_safe when starting the server
#从上文说明中可以看到数据库启动时会读取/etc/my.cnf,因此有可能会导致无法启动,避免的方法就是使用mysqld_safe启动服务时采用--defaults-file参数指定配置文件,前文已将/etc/my.cnf改名了,所以,就不需要指定参数了,这里是一个坑,读者要注意。
此步骤必须要初始化成功,否则,后面会出现登录不了数据库等各种问题。
(2)初始化数据库的原理及结果说明
初始化数据库的实质就是创建基础的数据库系统的库文件,例如:生成MySQL库表等。
初始化数据库后,查看数据目录,可以看到多了如下文件:
[root@oldboymysql-5.6.34]# ls -l /application/mysql/data
total110604
-rw-rw----.1 mysql mysql 12582912 Feb 26 18:08 ibdata1
-rw-rw----.1 mysql mysql 50331648 Feb 26 18:08 ib_logfile0
-rw-rw----.1 mysql mysql 50331648 Feb 26 18:08 ib_logfile1
drwx------.2 mysql mysql 4096 Feb 26 18:08 mysql#<==用于存放管理mysql的数据。
drwx------.2 mysql mysql 4096 Feb 26 18:08performance_schema #<==5.5及以上增加的内部性能库。
drwxr-xr-x.2 mysql mysql 4096 Feb 26 17:48test#<==用于测试的test数据库。
[root@oldboymysql-5.6.34]# tree /application/mysql/data#<==如果没有tree,可以yuminstall tree –y安装
/application/mysql/data
├──ibdata1
├──ib_logfile0
├──ib_logfile1
├──mysql
│ ├── columns_priv.frm
│ ├── columns_priv.MYD
│ ├── columns_priv.MYI
…省略若干…
│ ├── general_log.CSV
│ ├── general_log.frm
│ ├── help_category.frm
│ ├── procs_priv.frm
│ ├── procs_priv.MYD
│ ├── procs_priv.MYI
│ ├── proxies_priv.frm
│ ├── proxies_priv.MYD
│ ├── proxies_priv.MYI
│ ├── servers.frm
…省略若干…
│ ├── time_zone_name.MYI
│ ├── time_zone_transition.frm
│ ├── time_zone_transition.MYD
│ ├── time_zone_transition.MYI
│ ├── time_zone_transition_type.frm
│ ├── time_zone_transition_type.MYD
│ ├── time_zone_transition_type.MYI
│ ├── user.frm
│ ├── user.MYD
│ └── user.MYI
├──performance_schema
│ ├── accounts.frm
│ ├── cond_instances.frm
│ ├── db.opt
│ ├── events_stages_current.frm
│ ├── events_stages_history.frm
│ ├── events_stages_history_long.frm
│ ├──events_stages_summary_by_account_by_event_name.frm
…省略若干…
│ ├── threads.frm
│ └── users.frm
└── test
└── db.opt
3directories, 136 files
(3)MySQL初始化故障排错集锦
本节的所有故障必须要解除,否则,后面会出现登录不了MySQL数据库等各种问题,故障集锦见本章结尾内容
1)设置MySQL启动脚本
[root@oldboymysql-5.6.34]# pwd
/home/oldboy/tools/mysql-5.6.34
[root@oldboymysql-5.6.34]# cp support-files/mysql.server /etc/init.d/mysqld#<==拷贝mysql启动脚本到mysql的命令路径。
[root@oldboymysql-5.6.34]# chmod 700 /etc/init.d/mysqld#<==使脚本可执行。
[root@oldboymysql-5.6.34]# ls -l /etc/init.d/mysqld
-rwx------.1 root root 10929 Feb 26 18:26 /etc/init.d/mysqld
2)启动MySQL数据库
#<==这是启动数据库规范方法之一,还可以使用/application/mysql/bin/mysqld_safe--user=mysql &启动。这个命令结尾 “&”符号作用是,在后台执行mysql服务,这条命令执行完 还需要按下回车才能进入到命令行状态。
#<==注意,如果已执行上面/etc/init.d/mysqld start启动命令,还想尝试下面mysqld_safe的命令,请先执行/etc/init.d/mysqld stop结束mysql进程。
[root@oldboymysql-5.6.34]# cd ~
[root@oldboymysql-5.6.34]# /etc/init.d/mysqld start
StartingMySQL. SUCCESS!
提示:禁止使用pkill、kill -9、killall -9等命令强制杀死数据库,这会引起数据库无法启动等故障发生。企业中曾发生过的血的教训案例请看http://oldboy.blog.51cto.com/2561410/1431161。
3)检查MySQL数据库是否启动。
[root@oldboy~]# netstat -lntup|grep mysql
tcp 0 0 :::3306 :::* LISTEN 48065/mysqld
如发现3306端口没起来。请使用tail-100 /application/mysql/data/机器名.err检查日志报错进行调试。经常查看服务运行日志是个很好的习惯,也是高手的习惯,你要不要成为高手?嘿!
4)查看MySQL数据库启动结果日志。
[root@oldboy~]# tail /application/mysql/data/oldboy.err
2017-02-2617:38:36 48065 [Note] InnoDB: Waiting for purge to start
2017-02-2617:38:36 48065 [Note] InnoDB: 5.6.34 started; log sequence number 1625987
2017-02-2617:38:36 48065 [Warning] No existing UUID has been found, so we assume thatthis is the first time that this server has been started. Generating a newUUID: 4f94404a-fc74-11e6-8112-000c292ece3f.
2017-02-2617:38:36 48065 [Note] Server hostname (bind-address): '*'; port: 3306
2017-02-2617:38:36 48065 [Note] IPv6 is available.
2017-02-2617:38:36 48065 [Note] - '::' resolvesto '::';
2017-02-2617:38:36 48065 [Note] Server socket created on IP: '::'.
2017-02-2617:38:36 48065 [Note] Event Scheduler: Loaded 0 events
2017-02-2617:38:36 48065 [Note] /application/mysql-5.6.34/bin/mysqld: ready forconnections.
Version:'5.6.34' socket:'/application/mysql-5.6.34/tmp/mysql.sock' port: 3306 Source distribution
本例查看了错误日志的命令及错误日志中的内容,这里省略了大部分日志内容,只给了默认10行,如果有错误,一般会显示error字样。
5)设置MySQL开机自启动。
[root@oldboy~]# chkconfig --add mysqld
[root@oldboy~]# chkconfig --list mysqld
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
此外,将启动命令/etc/init.d/mysqld start放到/etc/rc.local里面实现开机自启动也可。
若MySQL安装及使用出现故障,可根据下面的分析思路进行检查。
q 细看所有执行命令返回的屏幕输出,不要忽略关键的输出内容。
q 辅助查看系统日志/var/log/messages。
q 如果是MySQL关联了其他服务,要同时查看相关服务的日志。
q 仔细阅读,重新查看操作的步骤是否正确,书写的命令及字符是不是都对。
经常查看各种服务运行日志是个很好的习惯,也是成长为高手的必经之路,你要不要成为高手?嘿!
如果不为MySQL的命令配置全局路径,就无法直接在命令行输入mysql这样的命令,只能用全路径命令(/application/mysql/bin/mysql),这种带着路径输入命令的方式很麻烦。下面来看看配置的具体方法。
1)确认mysql命令所在的路径。
[root@oldboy/]# ls /application/mysql/bin/mysql
/application/mysql/bin/mysql
2)在PATH变量前面增加/application/mysql/bin路径,并追加到/etc/profile文件中。
[root@oldboy/]# echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile
#<==注意,echo后是单引号呦,双引号是不行滴。
[root@oldboy/]# tail -1 /etc/profile
exportPATH=/application/mysql/bin:$PATH
[root@oldboy/]# source /etc/profile
#<==执行source使上一行添加到/etc/profile中,内容直接生效
#<==以上命令的用途为,定义mysql全局路径,实现在任意路径执行mysql命令。
[root@oldboy~]# echo $PATH
/application/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#<==执行echo $PATH有/application/mysql/bin输出表示配置成功。
提示:更简单的设置方法为用下面命令做软链接:ln -s /application/mysql/bin/* /usr/local/sbin/,把mysql命令所在路径链接到全局路径/usr/local/sbin/的下面。
要特别强调的是,务必把MySQL命令路径放在PATH路径中其他路径的前面,否则,可能会导致使用的mysql等命令和编译安装的mysql命令不是同一个,进而产生错误。下面的网址中给出了因为MySQL路径配置问题导致的错误案例:http://oldboy.blog.51cto.com/2561410/1122867,该错误实际上就是因为使用yum安装的MySQL客户端命令访问了编译安装的服务端而导致的。
登录并测试的命令如下:
[root@oldboy ~]# mysql#<==直接敲mysql就进入数据库了,而且身份还是root。
Welcometo the MySQL monitor. Commands end with; or \g.
YourMySQL connection id is 2
Serverversion: 5.6.34 Source distribution
Copyright(c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracleis a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
提示:你还可以使用如下三种命令写法登录mysql:
mysql -uroot -p,
mysql -uroot,
mysql -uroot -p '密码'
若出现登录故障,可通过以下方法排查。
如果这里提示无法登录,排除了数据库启动问题后,则很可能是数据库初始化文件有问题。例如:
[root@oldboy ~]# mysql
ERROR1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
解决办法:重新初始化数据库即可,此问题一般都是数据库初始化问题,或者数据库文件损坏,以及目录权限问题。
mysql>show databases;#<==查看当前的数据库
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|performance_schema |
|test |
+--------------------+
4 rowsin set (0.00 sec)
mysql>select user();#<==查看当前的登录用户
+----------------+
|user() |
+----------------+
|root@localhost |
+----------------+
1 row inset (0.00 sec)
mysql>#<==快捷键ctrl+d,也可以使用quit或exit等。
MySQL安装完成后,默认情况下,管理员账号root是无密码的,极不安全,必须要处理一下。
MySQL管理员的账号root密码默认为空,极不安全,可以通过mysqladmin命令为mysql不同实例的数据库设置独立的密码。
[root@oldboy~]# mysqladmin -u root password 'oldboy123'#<==为root用户设置密码oldboy123。
Warning:Using a password on the command line interface can be insecure.#<==这里是一个警告,提醒用户命令行放置密码是不安全的,读者尽量不要在命令行输入密码,而是采取交互式的输入密码。
[root@oldboy~]# mysql#<==无法直接输入命令登录了。
ERROR1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@oldboy~]# mysql -uroot -p#<==新的登录方式,也可以直接带密码mysql -uroot -poldboy123。
Enterpassword:#<==输入新密码oldboy123,交互式输入密码不会记录在命令记录里,因此更安全。
Welcometo the MySQL monitor. Commands end with; or \g.
YourMySQL connection id is 5
Serverversion: 5.6.34 Source distribution
Copyright(c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracleis a registered trademark of Oracle Corporation and/or its
affiliates.Other names may be trademarks of their respective
owners.
Type'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
读者也可以执行mysql_secure_installation命令交互式地设置系统的用户密码。
mysql>select user,host from mysql.user;
+------+-----------+
| user |host |
+------+-----------+
| root |127.0.0.1 |
| root |::1 |
| | localhost |
| root |localhost |
| | oldboy |
| root |oldboy |
+------+-----------+
6 rowsin set (0.00 sec)
mysql>drop user root@'::1';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user root@'oldboy';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user ''@'oldboy';
QueryOK, 0 rows affected (0.00 sec)
mysql>drop user ''@'localhost';
QueryOK, 0 rows affected (0.00 sec)
mysql>select user,host from mysql.user;
+------+-----------+
| user |host |
+------+-----------+
| root |127.0.0.1 |
| root |localhost |
+------+-----------+
2 rowsin set (0.00 sec)
提示:对于drop命令及数据库安全,后文会有详细讲解,此处不执行也可以。
有时用drop命令可能无法删除对应用户。比如,当数据库内的host等字段为大写及特殊Linux主机名时,删除用户就会遇到问题,例如:
mysql>drop user ' '@'MySQL';
ERROR1396 (HY000): Operation DROP USER failed for ' '@'mysql'
可使用DML语句,并采用delete命令删除来解决此问题,具体命令如下:
mysql>delete from mysql.user where user='' and host='MySQL';
QueryOK, 1 row affected (0.00 sec)
mysql>flush privileges;
QueryOK, 0 rows affected (0.00 sec)
mysql>drop database test;
QueryOK, 0 rows affected (0.00 sec)
mysql>show databases;
+--------------------+
|Database |
+--------------------+
|information_schema |
|mysql |
|performance_schema |
+--------------------+
3 rowsin set (0.00 sec)
有关更多的MySQL的安全措施,在后文会有更详细的讲解。