如果編寫一個小工具、小游戲,可以直接寫代碼,它不涉及存儲數據的操作,不過如果要編寫一個網絡工具、系統平臺、網絡游戲就需要將大量的數據存儲起來。
早期存儲數據都是使用文件存儲,不過使用文件作為存儲媒介是非常有局限性了。首先文件是獨立的,很難進行統計操作;其次文件依賴IO句柄,頻繁的進行打開文件、關閉文件,會對系統資源造成影響。
這時候數據庫(Database)就應運而生了,它可以最大限度的解決存儲和讀取的問題,依賴公共的SQL語法標準,可以快速、靈活的對數據庫引擎進行數據存儲和數據讀取。
MySQL是一款開源的、免費的、功能強大的數據庫引擎,今天就跟著福哥來學習如何在我們的TFLinux操作系統上面安裝MySQL數據庫引擎吧。
基本信息
安裝環境
CentOS:CentOS Linux release 7.6.1810 (Core)Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
軟件版本
mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
準備工作
本地化
如果是新環境,我們需要設置時區以保證時間顯示正確
timedatectl?set-timezone?Asia/Shanghai
安裝wget
如果環境里沒有wget,通過yum安裝一下
yum?-y?install?wget
安裝依賴包
yum?-y?install?libaio?numactl-libs
建立環境根目錄
mkdir?-p?/tongfu.net/env/
建立安裝包目錄并進入
mkdir?/packages
cd?/packages
安裝MySQL 5.7
準備
mysql-5.7.28-linux-glibc2.12-x86_64.tar.g
下載安裝包
下載mysql-5.7.28安裝包
wget?https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
創建賬號
需要創建一個用戶mysql
useradd?mysql
安裝mysql
我們下載的是編譯好的二進制版本,直接解壓縮即可使用
tar?-xzvf?mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz?-C?/tongfu.net/env/
cd?/tongfu.net/env/
mv?mysql-5.7.28-linux-glibc2.12-x86_64/?mysql-5.7.28
初始化
使用mysqld進行初始化
mkdir?mysql-5.7.28/data/
chown?-R?mysql.mysql?mysql-5.7.28/
./mysql-5.7.28/bin/mysqld?--initialize?--user=mysql?--basedir=/tongfu.net/env/mysql-5.7.28/?--datadir=/tongfu.net/env/mysql-5.7.28/data/
注意:執行完上面的命令后,會有初始化密碼打印出來,一定記得保存起來
2020-01-07T03:41:01.823712Z?0?[Warning]?TIMESTAMP?with?implicit?DEFAULT?value?is?deprecated.?Please?use?--explicit_defaults_for_timestamp?server?option?(see?documentation?for?more?details).
2020-01-07T03:41:03.374189Z?0?[Warning]?InnoDB:?New?log?files?created,?LSN=45790
2020-01-07T03:41:03.775803Z?0?[Warning]?InnoDB:?Creating?foreign?key?constraint?system?tables.
2020-01-07T03:41:03.952070Z?0?[Warning]?No?existing?UUID?has?been?found,?so?we?assume?that?this?is?the?first?time?that?this?server?has?been?started.?Generating?a?new?UUID:?87b0b720-30ff-11ea-9268-02420a100170.
2020-01-07T03:41:03.975895Z?0?[Warning]?Gtid?table?is?not?ready?to?be?used.?Table?'mysql.gtid_executed'?cannot?be?opened.
2020-01-07T03:41:04.839331Z?0?[Warning]?CA?certificate?ca.pem?is?self?signed.
2020-01-07T03:41:05.515747Z?1?[Note]?A?temporary?password?is?generated?for?root@localhost:?FwaKHorkK6;3
配置
默認my.cnf
刪除默認的my.cnf文件
rm?-f?/etc/my.cnf
啟動
啟動
修改啟動腳本
[root@dev?env]#?vi?./mysql-5.7.28/support-files/mysql.server
basedir=/tongfu.net/env/mysql-5.7.28/
datadir=/tongfu.net/env/mysql-5.7.28/data/
啟動服務
./mysql-5.7.28/support-files/mysql.server?start
修改默認密碼
使用前面在初始化的時候系統返回的信息里的最后一行的初始化密碼來修改root密碼
./mysql-5.7.28/bin/mysqladmin?-uroot?-p?password?"abcdef"
登錄
使用新密碼登錄
./mysql-5.7.28/bin/mysql?-uroot?-pabcdef
自動啟動
添加自動啟動腳本
[root@dev?env]#?cat?>?/lib/systemd/system/mysqld.service?<<EOF
[Unit]
Description=mysqld
After=network.target
[Service]
Type=forking
ExecStart=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server?start
ExecReload=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server?restart
ExecStop=/tongfu.net/env/mysql-5.7.28/support-files/mysql.server?stop
PrivateTmp=false
[Install]
WantedBy=multi-user.target
EOF
使用 systemctl 管理 mysqld 服務
systemctl?enable?mysqld?#?設置自動啟動
systemctl?start?mysqld?#?啟動服務
systemctl?stop?mysqld?#?停止服務
systemctl?restart?mysqld?#?重啟服務
服務命令添加到系統目錄
ln?-s?/tongfu.net/env/mysql-5.7.28/bin/mysql?/usr/bin/
ln?-s?/tongfu.net/env/mysql-5.7.28/bin/mysqldump?/usr/bin/
常見錯誤
常見錯誤1
在新版本的 mysql 里是找不到 my.cnf 配置文件的,因為 mysql 把大部分參數都設置了默認值,原則上我們不需要設置太多參數
如果想要設置的話,可以從舊版本的 mysql 環境下復制過來,放到mysql的安裝目錄下。當然,你也可以像以前那樣放到 /etc/my.cnf,不過,這樣不利用管理和遷移
常見錯誤2
在新版本的 mysql 里使用 group by 語句的時候有了限制,簡單說就是 group by 的字段必須在select 內出現,這樣的話 select * from xxx group by yyy 就行不通了。
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解決方法,在 my.cnf 里增加一行設置即可
sql_mode = “STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
這樣就可以隨便寫了~
常見錯誤3
新版本的 mysql 在做同步復制的時候,發現 server_id 改了沒有變化,始終是 4294967295,怎么回事?經過各自嘗試發現,原理新版本的 mysql 對于 server_id 的位數做了限制,數字不能超過10位,否則就會溢出了
TNND,能不能向后兼容啊~~
常見錯誤4
如果在導入 sql 的時候發現寫入速度非常慢,可以從以下幾個方面檢查
- 檢查 max_allowed_packet 是否設置太小了,這個會影響大 sql 的寫入速度,一般情況下 dump 出來的 sql 都是多行用一個 insert 語句執行寫入的
- 檢查是不是使用的 innodb 引擎的數據表,innodb 數據表寫和讀都要比 myisam 慢一些
- 檢查有沒有關閉 log-bin,這玩意沒關閉的話導入速度會慢幾百倍,上千倍,強烈建議導入數據時候關閉它?。?/li>
- 檢查 innodb_flush_log_at_trx_commit 有沒有設置為 0,這玩意設置了非 0 的值的話導入速度也會慢幾十倍,強烈建議導入數據時候關閉它?。?/li>
常見錯誤5
在通過 mysql 連接數據庫時候提示找不到 socket 文件的話ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)解決方法,在 my.cnf 里設置一下
使用
連接數據庫服務器
使用下面的命令連接到MySQL數據庫服務器
[root@dev?env]#?mysql?-uroot?-pabcdef
mysql:?[Warning]?Using?a?password?on?the?command?line?interface?can?be?insecure.
Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?\g.
Your?MySQL?connection?id?is?3
Server?version:?5.7.28?MySQL?Community?Server?(GPL)
Copyright?(c)?2000,?2019,?Oracle?and/or?its?affiliates.?All?rights?reserved.
Oracle?is?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>
創建數據庫
一個數據庫服務器可以有若干個數據庫,每個數據庫作為一個項目的數據存儲介質使用
使用下面的命令可以創建一個數據庫,福哥創建的是test數據庫
mysql>?create?database?test?default?charset?utf8;
Query?OK,?1?row?affected?(0.00?sec)
查看數據庫列表
使用下面的命令查看服務器的數據庫列表,列表包括很多系統數據庫,其中還有我們剛剛創建的test庫
mysql>?show?databases;
+--------------------+
|?Database???????????|
+--------------------+
|?information_schema?|
|?mysql??????????????|
|?performance_schema?|
|?sys????????????????|
|?test???????????????|
+--------------------+
5?rows?in?set?(0.00?sec)
選擇數據庫
我們要選擇一個數據庫作為我們正在操作的庫
mysql>?use?test;
Database?changed
創建數據表
一個數據庫可以有若干多個數據表,每個數據表代表著一組同類型的數據,例如:用戶,留言等等
使用下面的命令可以創建一個數據表,福哥創建的是test數據表,包括兩個字段id和name
mysql>?CREATE?TABLE?`test`?(
????->?`id`?int?NOT?NULL?AUTO_INCREMENT,?
????->?`name`?varchar(45)?NOT?NULL,?
????->?PRIMARY?KEY?(`id`)
????->?);
Query?OK,?0?rows?affected?(0.00?sec)
插入新數據
現在我們要像這個數據表test里插入數據了,數據表test有兩個字段,分別是int類型和varchar類型,我們可以根據這兩個字段的類型向里面寫入值
插入語句如下
mysql>?INSERT?INTO?test?(name)?VALUES?('福哥');
Query?OK,?1?row?affected?(0.10?sec)
查看數據表數據
現在數據表test里面已經有了一條數據了,我們可以通過SQL語句對這個數據表進行查詢,得到數據表里面的數據
查詢語言句如下
mysql>?SELECT?*?FROM?test;
+----+--------+
|?id?|?name???|
+----+--------+
|??1?|?福哥???|
+----+--------+
1?row?in?set?(0.00?sec)
修改數據表數據
我們可以通過數據表的id精確地對這一行的數據進行修改操作,因為id這一列的數據是唯一的,可以幫助我們精確定位某一具體數據行
更新語句如下
mysql>?UPDATE?test?SET?name?=?'福哥加油'?WHERE?id?=?1;
Query?OK,?1?row?affected?(0.00?sec)
Rows?matched:?1??Changed:?1??Warnings:?0
刪除數據表數據
如果需要刪除掉數據表當中的數據,可以通過數據表的id精確定位某一行數據,將之刪除掉
刪除語句如下
mysql>?DELETE?FROM?test?WHERE?id?=?1;
Query?OK,?1?row?affected?(0.00?sec)
查看數據表數據
再次查看數據表數據,可以看到數據表里已經空空如也了
mysql>?SELECT?*?FROM?test;
Empty?set?(0.00?sec)
退出數據庫服務器
操作完了之后,就可以退出數據庫服務器連接了
mysql>?exit
Bye
總結
學會了MySQL的使用技巧,今后我們就可以做一些非常有意思的東西了!目前福哥教大家的語言c/c++、java、php和python都是可以連接MySQL數據庫的,結合MySQL數據庫我們可以做一些中大型的項目,包括且不限于一個博客,一個論壇,一個留言板,一個換裝游戲,一個情景游戲等等。
接下來福哥會一個一個地介紹使用c/c++、java、php、python操作MySQL的方法,童鞋們一定要跟上哦~~
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。