搜尋
首頁資料庫mysql教程在CentOS上源码安装MySQL+安装问题解决+安全优化_MySQL

0.说明

当然,MySQL的安装方法多种多样,在CentOS上,你可以采用YUM的方式安装,这样的好处是:快速方便。基本上,它会帮你解决所有的函数库依赖问题,正常情况下,只要YUM执行完成,那么MySQL也就可以使用了。

但我更倾向于使用源码的方式来安装MySQL,原因也很简单:除了有详细的官方文档外,你还可以非常清楚地知道你自己在做什么,这点在以后MySQL运行出现问题时将会有很大的帮助!

但即便是按照官方文档来安装,你也会遇到各种各样的问题,这里,我将呈现一个完整的过程给大家,直到完成下面的4个任务:

下载MySQL 5.6

安装准备:安装MySQL依赖函数库

安装与运行MySQL

优化MySQL

(1)账户安全优化

(2)数据库安全优化

我是安装完CentOS 6.5后就进行MySQL 5.6的安装,因此非常有参考价值!

1.下载MySQL 5.6

下载地址:http://dev.mysql.com/downloads/mysql/5.6.html

进入该下载地址后,选择:

Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive

Linux - Generic (glibc 2.5) (x86, 32-bit), Compressed TAR Archive

这取决于你用的是32位的还是64位的,这里,我下载的是64位的,下载完成后的包如下:

[root@leaf~]#ls
mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz

2.安装准备:安装MySQL依赖函数库

MySQL依赖一个名为libaio的函数库,需要先安装它,否则后面安装MySQL会出现问题。

如下:

[root@leaf~]#yumsearchlibaio#查找libaio的相关信息
[root@leaf~]#yuminstalllibaio#安装libaio
Loadedplugins:security
SettingupInstallProcess
Packagelibaio-0.3.107-10.el6.x86_64alreadyinstalledandlatestversion
Nothingtodo

当然,有可能在你安装完CentOS后,你就已经安装了libaio,这取决你你当时安装CentOS时所选择的安装包,如上面我的安装提示,就说明我的系统上已经安装了libaio了。


 

3.安装与运行MySQL

(1)分别创建一个名为mysql的用户和用户组

如下:

[root@leaf~]#groupaddmysql
[root@leaf~]#useradd-r-gmysql-s/bin/falsemysql

-r和-s参数的可以使得mysql这个用户没有登陆你系统的权限,这可以保证系统的安全性。

(2)解包与建立软链接

如下:

[root@leaf~]#cd/usr/local
[root@leaflocal]#tarzxvf/root/mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz
[root@leaflocal]#ln-s/usr/local/mysql-5.6.29-linux-glibc2.5-x86_64/mysql

需要知道的是,正常情况下,我们习惯将编译安装的软件放在/usr/local目录下,当然你也可以自行选择,不过还是建议放在这里。

建立软链接的好处是,如果你需要使用mysql的安装目录,就不用去输入一长串的目录名称了,因为我们解压缩后的mysql包的目录,名字很长。

 

(3)初始化Data目录

解包完MySQL后,MySQL目录中会有一个data目录:

[root@leaflocal]#cdmysql
[root@leafmysql]#ls-ddata/
data/

里面包含的是MySQL运行所必需的系统信息,因此我们需要将这些数据初始化,如下:

[root@leafmysql]#chown-Rmysql.#修改mysql目录下的所有文件的属主为mysql
[root@leafmysql]#chgrp-Rmysql.#修改mysql目录下的所有文件的属组为mysql
[root@leafmysql]#scripts/mysql_install_db--user=mysql#以mysql用户的身份初始化数据
[root@leafmysql]#chown-Rroot.#修改mysql目录下的所有文件的属主为root
[root@leafmysql]#chown-Rmysqldata#修改mysql目录下的data目录的属主为mysql

请务必按照上面的操作进行,至于详细的是什么意思,为什么要这样做,可以参考官方文档,有非常详细的解释:http://dev.mysql.com/doc/refman/5.6/en/data-directory-initialization.html

(4)启动MySQL

如下:

[root@leafmysql]#bin/mysqld_safe--user=mysql&
[1]30877
[root@leafmysql]#16030611:58:50mysqld_safeLoggingto'/var/log/mysqld.log'.
16030611:58:50mysqld_safeStartingmysqlddaemonwithdatabasesfrom/var/lib/mysql
16030611:58:51mysqld_safemysqldfrompidfile/var/run/mysqld/mysqld.pidended

理论上应该是可以的,但是看我上面的操作,出现了ended的提示,也就是mysql启动不了,这时我们去看一下日志信息:

[root@leaf~]#tail-f/var/log/mysqld.log
......
2016-03-0612:00:3631231[ERROR]/usr/local/mysql/bin/mysqld:Can'tcreate/writetofile'/var/run/mysqld/mysqld.pid'(Errcode:2-Nosuchfileordirectory)
2016-03-0612:00:3631231[ERROR]Can'tstartserver:can'tcreatePIDfile:Nosuchfileordirectory
16030612:00:36mysqld_safemysqldfrompidfile/var/run/mysqld/mysqld.pidended

问题:can't create PID file: No such file or directory,即找不到mysql启动的pid文件

解决方案:mysqld目录不存在,我们创建它就可以了

[root@leafmysql]#mkdir/var/run/mysqld
[root@leafmysql]#cd/var/run/mysqld/
[root@leafmysqld]#touchmysqld.pid#创建mysqld.pid文件
[root@leafmysqld]#cd..
[root@leafrun]#chown-Rmysqlmysqld#将mysqld目录的属主设置为mysql

回到mysql目录,我们再启动一次mysql,如下:

[root@leafrun]#cd/usr/local/mysql
[root@leafmysql]#bin/mysqld_safe--user=mysql
16030612:12:45mysqld_safeLoggingto'/var/log/mysqld.log'.
16030612:12:45mysqld_safeStartingmysqlddaemonwithdatabasesfrom/var/lib/mysql

可以看到并没有终止运行的提示信息,我们再确认一下mysql服务是不是已经启动了:

[root@leaf~]#netstat-antup
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programname
tcp000.0.0.0:33060.0.0.0:*LISTEN31484/mysqld

mysql服务确实已经成功启动了!

(5)测试mysql服务

为了使mysql可以更好地在你的系统上运行,建议进行一定的mysql服务测试,如下:

[root@leafmysql]#bin/mysqladminversion
bin/mysqladmin:connecttoserverat'localhost'failed
error:'Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)'
Checkthatmysqldisrunningandthatthesocket:'/tmp/mysql.sock'exists!

按照官方文档的操作去测试,但却出现了上面的问题(需要注意的是,我的mysql服务已经开启了!)。

问题:/tmp/mysql.sock不存在

解决方案:其实mysql.sock是存在的,只是它不在/tmp目录下而已,默认情况下,mysql.sock在/var/lib/mysql/目录下,我们只需要创建一个软链接到/tmp目录下即可

[root@leafmysql]#ln-s/var/lib/mysql/mysql.sock/tmp/mysql.sock

这时再重复上面的操作:

[root@leafmysql]#bin/mysqladminversion
bin/mysqladminVer8.42Distrib5.6.29,forlinux-glibc2.5onx86_64
Copyright(c)2000,2016,Oracleand/oritsaffiliates.Allrightsreserved.

OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.

Serverversion5.6.29
Protocolversion10
ConnectionLocalhostviaUNIXsocket
UNIXsocket/tmp/mysql.sock
Uptime:6min36sec

Threads:1Questions:2Slowqueries:0Opens:67Flushtables:1Opentables:60Queriespersecondavg:0.005

成功了!然后我们再进行下面的操作热热身吧:

[root@leafmysql]#bin/mysqladmin-urootshutdown#通过mysqladmin关闭mysql服务
[root@leafmysql]#bin/mysqld_safe--user=mysql&#启动mysql服务

#查看mysql数据库中默认存在的数据库
[root@leafmysql]#bin/mysqlshow
+--------------------+
|Databases|
+--------------------+
|information_schema|
|mysql|
|performance_schema|
|test|
+--------------------+

#查看mysql数据库(注意此mysql数据库是一个实体,与上面的统称不同)中的数据表
[root@leafmysql]#bin/mysqlshowmysql
Database:mysql
+---------------------------+
|Tables|
+---------------------------+
|columns_priv|
|db|
|event|
|func|
|general_log|
|help_category|
|help_keyword|
|help_relation|
|help_topic|
|innodb_index_stats|
|innodb_table_stats|
|ndb_binlog_index|
|plugin|
|proc|
|procs_priv|
|proxies_priv|
|servers|
|slave_master_info|
|slave_relay_log_info|
|slave_worker_info|
|slow_log|
|tables_priv|
|time_zone|
|time_zone_leap_second|
|time_zone_name|
|time_zone_transition|
|time_zone_transition_type|
|user|
+---------------------------+

#查看mysql数据库中的所有user表
[root@leafmysql]#bin/mysql-e"SELECTUser,Host,pluginFROMmysql.user"mysql
+------+-----------+-----------------------+
|User|Host|plugin|
+------+-----------+-----------------------+
|root|localhost|mysql_native_password|
|root|leaf|mysql_native_password|
|root|127.0.0.1|mysql_native_password|
|root|::1|mysql_native_password|
||localhost|mysql_native_password|
||leaf|mysql_native_password|
+------+-----------+-----------------------+

需要注意的是,上面的这些测试必须要在你已经启动了mysql服务的情况下才去进行操作。同时,如果想知道每一步的详细解释,可以参考官方文档:http://dev.mysql.com/doc/refman/5.6/en/testing-server.html

准确来讲,MySQL是已经成功安装完成了!下面我们再做一些基础的优化,主要是从安全的角度去考虑。

4.优化MySQL

(1)MySQL数据库用户账户安全优化

--默认情况下用户账户很不安全

前面我们在对data目录进行初始化的过程中,其实MySQL就为我们创建了一些mysql账户,这些账户以及它们的权限就在mysql.user这张表中(下面会有操作查看),这里我们要对这些初始化的账户进行说明和必要的管理。

首先,我们以命令行方式进行mysql数据库中:

[root@leaf~]#mysql
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis7
Serverversion:5.6.29MySQLCommunityServer(GPL)

Copyright(c)2000,2013,Oracleand/oritsaffiliates.Allrightsreserved.

OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.

Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.

mysql>

可以看到不用任何密码就可以进入到数据库中,实际上,我们是以root用户的身份登陆到mysql数据库中的。

查看默认的用户名:

mysql>selectUser,Host,Passwordfrommysql.user;
+------+-----------+----------+
|User|Host|Password|
+------+-----------+----------+
|root|localhost||
|root|leaf||
|root|127.0.0.1||
|root|::1||
||localhost||
||leaf||
+------+-----------+----------+
6rowsinset(0.00sec)

从这张表中,我们可以看到有两种用户:

a.root用户:拥有最高权限

b.匿名用户:拥有有限的权限

而至于Host参数,则是说明通过该用户,能够以哪种方式进入mysql数据库中,比如对于root用户,现在的方法都是可以进入mysql数据库中的:

mysql -u root -h localhost

mysql -u root -h leaf

mysql -u root -h 127.0.0.1

mysql -u root -h ::1

匿名用户也是如此,但不管哪一种,其实都是指从本地登陆的意思。

但我们会发现一个问题,就是两种用户中Password一栏都为空,这也就是为什么刚刚我们直接输入一个mysql就可以进入的原因了,默认情况下,root用户和匿名用户都没有密码!

这也就是我们为什么要做基本优化的原因了,因为你不对这些用户做管理,那么谁都可以进行你的数据库,数据库完全将无从谈起!

 

--账户安全优化1:为root用户创建密码

接下来我们要做的是:

为每一个root用户创建密码

有三种方式可以进行这些操作:

  1. 使用set password语句

    使用update语句

    使用mysqladmin命令

    方式1:使用set password语句

    [root@leaf~]#mysql-uroot
    mysql>setpasswordfor'root'@'localhost'=password('123456');
    mysql>setpasswordfor'root'@'127.0.0.1'=password('123456');
    mysql>setpasswordfor'root'@'::1'=password('123456');
    mysql>setpasswordfor'root'@'leaf'=password('123456');
    mysql>flushprivileges;

    方式2:使用update语句

    [root@leaf~]#mysql-uroot
    mysql>updatemysql.usersetpassword=password('123456')
    ->whereUser='root';
    mysql>flushprivileges;

    方式3:使用mysqladmin命令

    [root@leaf~]#mysqladmin-urootpassword'123456'

    当然,上面三种方式选一种就可以了。这样的话,我们就为root用户创建了密码,以后在使用root用户登陆到数据库时都需要输入密码,如下:

    [root@leaf~]#mysql-uroot
    ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:NO)
    [root@leaf~]#mysql-uroot-p
    Enterpassword:

    这时再重新看一下mysql.user表:

    mysql>selectUser,Host,Passwordfrommysql.user;+------+-----------+-------------------------------------------+
    |User|Host|Password|
    +------+-----------+-------------------------------------------+
    |root|localhost|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|
    |root|leaf|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|
    |root|127.0.0.1|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|
    |root|::1|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|
    ||localhost||
    ||leaf||
    +------+-----------+-------------------------------------------+
    6rowsinset(0.00sec)

    可以看到已经为root用户创建为密码,只是这里显示的是密码被哈希加密后的值。

    --账户安全优化2:为匿名用户创建密码或删除匿名用户

    接下来我们要做的是:

    为匿名用户创建密码或删除匿名用户

    a.为匿名用户创建密码

    与上面的方法相同:

    [root@leaf~]#mysql-uroot-p
    Enterpassword:
    mysql>updatemysql.usersetpassword=password('123456')whereUser='';
    mysql>flushprivileges;

    这里我们使用update语句的方法。

    另外注意这里的`flush privileges`语句,这个语句的作用是使我们刚刚修改密码的操作马上生效,而无需重启mysql服务,如果没有使用该语句,同时也没有重启mysql服务,使用新密码重新登陆mysql时会一直提示ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)错误。

    b.删除匿名用户

    如果你觉得匿名用户留着实在没有什么必要的话,也可以直接将其删除:

    shell>mysql-uroot-p
    Enterpassword:(enterrootpasswordhere)
    mysql>DROPUSER''@'localhost';
    mysql>DROPUSER''@'host_name';

    (2)MySQL测试数据库安全优化

    --默认情况下的数据库本身存在安全隐患

    官方文档的说明:

    the mysql.db table contains rows that permit all accounts to access the testdatabase and other databases with names that start with test_

    也就是说mysql.db表中有些行允许所有的用户访问test数据库或以名字test_开头的数据库,虽然这对于测试数据库很方便,但其还是带来了一定的安全隐患,所以我们也要对其进行优化。

    --数据库安全优化:删除test数据库或名字以test开头的数据库

    如下:

    [root@leaf~]#mysql-uroot-p
    mysql>deletefrommysql.dbwheredblike'test%';
    mysql>dropdatabasetest;
    mysql>flushprivileges;

    关于基本的安全优化,可以参考官方文档:http://dev.mysql.com/doc/refman/5.6/en/default-privileges.html

    到这里的话本文就结束了,如果你是在CentOS上初次编译安装MySQL,只要你按照上面的方法去做,正常情况下是不会出现什么问题的,博主已进行多次测试。

    当然,当你已经完全熟悉这样的一个过程之后,以后编译安装时就不需要再一步步这样去做了,只需要写个一键安装部署的脚本就可以了。

    陳述
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    說明InnoDB重做日誌和撤消日誌的作用。說明InnoDB重做日誌和撤消日誌的作用。Apr 15, 2025 am 12:16 AM

    InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

    在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?Apr 15, 2025 am 12:15 AM

    EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

    在解釋中使用臨時狀態以及如何避免它是什麼?在解釋中使用臨時狀態以及如何避免它是什麼?Apr 15, 2025 am 12:14 AM

    Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB

    描述不同的SQL交易隔離級別(讀取未讀取,讀取,可重複的讀取,可序列化)及其在MySQL/InnoDB中的含義。描述不同的SQL交易隔離級別(讀取未讀取,讀取,可重複的讀取,可序列化)及其在MySQL/InnoDB中的含義。Apr 15, 2025 am 12:11 AM

    MySQL/InnoDB支持四種事務隔離級別:ReadUncommitted、ReadCommitted、RepeatableRead和Serializable。 1.ReadUncommitted允許讀取未提交數據,可能導致臟讀。 2.ReadCommitted避免臟讀,但可能發生不可重複讀。 3.RepeatableRead是默認級別,避免臟讀和不可重複讀,但可能發生幻讀。 4.Serializable避免所有並發問題,但降低並發性。選擇合適的隔離級別需平衡數據一致性和性能需求。

    MySQL與其他數據庫:比較選項MySQL與其他數據庫:比較選項Apr 15, 2025 am 12:08 AM

    MySQL適合Web應用和內容管理系統,因其開源、高性能和易用性而受歡迎。 1)與PostgreSQL相比,MySQL在簡單查詢和高並發讀操作上表現更好。 2)相較Oracle,MySQL因開源和低成本更受中小企業青睞。 3)對比MicrosoftSQLServer,MySQL更適合跨平台應用。 4)與MongoDB不同,MySQL更適用於結構化數據和事務處理。

    MySQL索引基數如何影響查詢性能?MySQL索引基數如何影響查詢性能?Apr 14, 2025 am 12:18 AM

    MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

    MySQL:新用戶的資源和教程MySQL:新用戶的資源和教程Apr 14, 2025 am 12:16 AM

    MySQL學習路徑包括基礎知識、核心概念、使用示例和優化技巧。 1)了解表、行、列、SQL查詢等基礎概念。 2)學習MySQL的定義、工作原理和優勢。 3)掌握基本CRUD操作和高級用法,如索引和存儲過程。 4)熟悉常見錯誤調試和性能優化建議,如合理使用索引和優化查詢。通過這些步驟,你將全面掌握MySQL的使用和優化。

    現實世界Mysql:示例和用例現實世界Mysql:示例和用例Apr 14, 2025 am 12:15 AM

    MySQL在現實世界的應用包括基礎數據庫設計和復雜查詢優化。 1)基本用法:用於存儲和管理用戶數據,如插入、查詢、更新和刪除用戶信息。 2)高級用法:處理複雜業務邏輯,如電子商務平台的訂單和庫存管理。 3)性能優化:通過合理使用索引、分區表和查詢緩存來提升性能。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您聽不到任何人,如何修復音頻
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解鎖Myrise中的所有內容
    1 個月前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中