Linux下安裝mysql
-
到mysql官網下載mysql編譯好的二進制安裝包,在下載頁面Select Platform:選項選擇linux-generic,然后把頁面拉到底部,64位系統下載Linux - Generic (glibc 2.5) (x86, 64-bit),32位系統下載Linux - Generic (glibc 2.5) (x86, 32-bit)
安裝前准備:
1.先檢查Linux中是否存在mysql rpm -qa|grep mysql
2:如果存在,請先執行卸載命令:rpm -e --nodeps mysql-libs --nodeps代表:可能其他地方有依賴mysql,這里強制卸載
3:檢查 /tmp文件夾權限,由於mysql安裝過程中,會通過mysql用戶在/tmp目錄下新建tmp_db文件,所以請給/tmp較大的權限
chmod -R 777 /tmp
4:檢查各個mysql文件夾是否刪除干凈
find / -name mysql
結果如下:
/var/lib/mysql
/usr/local/mysql
/usr/lib/mysql
/usr/include/mysql
命令刪除:
rm -fr /usr/lib/mysql
rm -fr /usr/include/mysql
注意:卸載后/var/lib/mysql中的數據及/etc/my.cnf不會刪除,如果確定沒用后就手工刪除
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
刪除mysql用戶及用戶組
userdel mysql
groupdel mysql
MySQL正式安裝和相關設置(這里以mysql8.0.11為例)
1:上傳壓縮包到linux
解壓壓縮包:
tar -zxvf mysql-8.0.11-linux-glibc2.12-i686.tar.gz
# 移動解壓后的文件夾至/usr/local
mv /usr/local/src/mysql-8.0.11-linux-glibc2.12-x86_64 /usr/local/
# 重命名
mv ./mysql-8.0.11-linux-glibc2.12-x86_64 mysql-8.0
# 創建文件夾data,存儲文件;
cd /usr/local/mysql-8.0/ mkdir ./data2 創建用戶及用戶組
# 用戶組 groupadd mysql # 用戶 (用戶名/密碼) useradd -g mysql mysql
3、授權
chown -R mysql.mysql /usr/local/mysql-8.0/ # 親測 或 chown -R mysql . chgrp -R mysql .
4 初始化數據庫
# 查看當前所在目錄 pwd # 若顯示/usr/local/mysql-8.0,請繼續執行,否則請先進入此目錄/usr/local/mysql-8.0 # 初始化 注意查看是否存在相關目錄,若不存在,請新建 ./bin/mysqld --user=mysql --basedir=/usr/local/mysql-8.0/ --datadir=/usr/local/mysql-8.0/data/ --initialize ; # 親測 或 ./bin/mysql --user=mysql --basedir=/usr/local/mysql-8.0/ --datadir=/usr/local/mysql-8.0/data/ --initialize ;
生成的臨時密碼:

5 Mysql配置
以下按需配置:
vi /etc/my.cnf[client] port = 3306 socket = /tmp/mysql.sock
[mysqld] #Mysql服務的唯一編號 每個mysql服務Id需唯一 server-id = 1 #服務端口號 默認3306 port = 3306 #mysql安裝根目錄 basedir = /usr/local/mysql #mysql數據文件所在位置 datadir = /usr/local/mysql/data #pid pid-file = /usr/local/mysql/mysql.pid #設置socke文件所在目錄 socket = /tmp/mysql.sock #設置臨時目錄 tmpdir = /tmp # 用戶 user = mysql # 允許訪問的IP網段 bind-address = 0.0.0.0 # 跳過密碼登錄 #skip-grant-tables #主要用於MyISAM存儲引擎,如果多台服務器連接一個數據庫則建議注釋下面內容 skip-external-locking #只能用IP地址檢查客戶端的登錄,不用主機名 skip_name_resolve = 1 #事務隔離級別,默認為可重復讀,mysql默認可重復讀級別(此級別下可能參數很多間隙鎖,影響性能) transaction_isolation = READ-COMMITTED #數據庫默認字符集,主流字符集支持一些特殊表情符號(特殊表情符占用4個字節) character-set-server = utf8mb4 #數據庫字符集對應一些排序等規則,注意要和character-set-server對應 collation-server = utf8mb4_general_ci #設置client連接mysql時的字符集,防止亂碼 init_connect='SET NAMES utf8mb4' #是否對sql語句大小寫敏感,1表示不敏感 lower_case_table_names = 1 #最大連接數 max_connections = 400 #最大錯誤連接數 max_connect_errors = 1000 #TIMESTAMP如果沒有顯示聲明NOT NULL,允許NULL值 explicit_defaults_for_timestamp = true #SQL數據包發送的大小,如果有BLOB對象建議修改成1G max_allowed_packet = 128M #MySQL連接閑置超過一定時間后(單位:秒)將會被強行關閉 #MySQL默認的wait_timeout 值為8個小時, interactive_timeout參數需要同時配置才能生效 interactive_timeout = 1800 wait_timeout = 1800 #內部內存臨時表的最大值 ,設置成128M。 #比如大數據量的group by ,order by時可能用到臨時表, #超過了這個值將寫入磁盤,系統IO壓力增大 tmp_table_size = 134217728 max_heap_table_size = 134217728 #禁用mysql的緩存查詢結果集功能 #后期根據業務情況測試決定是否開啟 #大部分情況下關閉下面兩項 query_cache_size = 0 query_cache_type = 0 #數據庫錯誤日志文件 log_error = error.log #慢查詢sql日志設置 slow_query_log = 1 slow_query_log_file = slow.log #檢查未使用到索引的sql log_queries_not_using_indexes = 1 #針對log_queries_not_using_indexes開啟后,記錄慢sql的頻次、每分鍾記錄的條數 log_throttle_queries_not_using_indexes = 5 #作為從庫時生效,從庫復制中如何有慢sql也將被記錄 log_slow_slave_statements = 1 #慢查詢執行的秒數,必須達到此值可被記錄 long_query_time = 8 #檢索的行數必須達到此值才可被記為慢查詢 min_examined_row_limit = 100 #mysql binlog日志文件保存的過期時間,過期后自動刪除 expire_logs_days = 5建立MySQL服務
# 添加Mysql到系統服務 cd /usr/local/mysql-8.0 cp -a ./support-files/mysql.server /etc/init.d/mysql # 若mysqld,以下mysql相應的修改mysqld,如下圖所示 chmod +x /etc/init.d/mysql chkconfig --add mysql # 檢查服務是否生效 chkconfig --list mysql

啟動Mysql服務
# 啟動 service mysql start; # 查看啟動狀態 service mysql status;
系統默認會查找/usr/bin下的命令,如果這個命令不在這個目錄下,會找不到mysql的相關命令,我們需要做的就是映射一個鏈接到/usr/bin目錄下,相當於建立一個鏈接文件
首先得知道mysql命令或mysqladmin命令的完整路徑,比如mysql的路徑是:/usr/local/mysql-8.0/bin/mysql,我們則可以這樣執行命令: # ln -s /usr/local/mysql-8.0/bin/mysql /usr/bin修改root密碼
# 進入mysql
mysql -uroot -p
輸入初始密碼# 如果想要所有主機都可訪問,把localhost改成% alter user 'root'@'localhost' identified with mysql_native_password by '123456'; # 刷新 flush privileges;開放3306端口:
讓外網能夠訪問mysql
a.配置防火牆: firewall-cmd --zone=public --add-port=3306/tcp --permanent(開放3306端口)
systemctl restart firewalld(重啟防火牆以使配置即時生效)
查看系統所有開放的端口:firewall-cmd --zone=public --list-ports
常用的mysql操作命令:
1:新建mysql用戶: 登錄mysql mysql -u root -p 輸入密碼 CREATE USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'qwe123'; 注意:此處的"localhost",是指該用戶只能在本地登錄,不能在另外一台機器上遠程登錄。如果想遠程登錄的話,將"localhost"改為"%",表示在任何一台電腦上都可以登錄。也可以指定某台機器可以遠程登錄。如果需要限定IP訪問,可以修改localhost-->指定IP地址。 如果還需要設置到另一個ip, 那么就需要重復上面的步驟: CREATE USER 'test'@'129.xxx.xxx.xx' IDENTIFIED WITH mysql_native_password BY 'qwe123'; 2. 為用戶授權 這里直接賦所有的權限 GRANT ALL PRIVILEGES ON *.* TO 'test'@'139.xxx.xxx.xx' 如果需要指定權限,就將ALL改為SELECT DELETE UPDATE INSERT等四種權限任選即可grant insert,select,update on test01.* to 'mayiic_dev'@'%';flush privileges; //刷新系統權限表
3、刪除指定的用戶:
drop user 'test'@'106.xxx.xx.xx';
4、 查詢用戶和權限
use mysql;
select Host,User from user where user='root';
show grants for root;1、 顯示數據庫列表。 show databases; 2、 顯示庫中的數據表: # 指定數據庫 use mysql; #顯示指定庫中的表 show tables; 3、 顯示數據表的結構: describe 表名; 4、 建庫與刪庫: create database 庫名; drop database 庫名;MySQL8.0 忘記 root 密碼下如何修改密碼?1、vim /etc/my.cnf,添加 skip-grant-table(跳過權限驗證)
binlog日志,即binary log,是二進制日志文件。它有兩個作用,一是增量備份,即只備份新增的內容;二是用於主從復制等,即主節點維護了一個binlog日志文件,從節點從binlog中同步數據。我們可以通過binlog日志恢復數據。下面就介紹一下開啟MySQL binlog日志的過程:
1、登錄MySQL,查看binlog日志的狀態
登錄MySQL后,輸入 show variables like '%log_bin%';查看到binlog日志為OFF關閉狀態;

2、開啟MySQL binlog日志
vi /etc/my.cnf
server_id=2 #log日志文件存放位置 log_bin = /var/bin/mysql/mysql-bin binlog_format = ROW expire_logs_days = 30
注意:每次服務器(數據庫)重啟,服務器會調用flush logs;,新創建一個binlog日志
cd /var/bin/mysql/mysql-bin

數據恢復語法:
恢復語法 恢復命令的語法格式: mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數據庫名 常用參數選項解釋: --start-position=780 起始pos點 --stop-position=904 結束pos點 --start-datetime="2019-3-27 12:04:08" 起始時間點 --stop-datetime="2019-3-27 12:49:46" 結束時間點 --database=my_test 指定只恢復my_test數據庫(一台主機上往往有多個數據庫,只限本地log日志) !!!!Ubuntu我沒用熟悉吧 牢記 在mysqlbinlog和mysq前面都要加上sudo!!!! For example 指定pos結束點恢復(部分恢復) 恢復到780節點 sudo mysqlbinlog mysql-bin.000002 --stop-position 780 | sudo mysql -uroot -p my_test
binlog 日志文件轉sql
進入mysql 的安裝目錄bin 目錄執行----》mysql-bin.000011的文件路徑
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000011 -d db1 > db1.sql //將row格式的binlog日志文件base64解析后轉入文件,-v代表換行展示
mysqlbinlog --start-date="2017-08-12 15:00:19" --stop-date="2017-08-12 15:30:19" mysql-bin.000011 -d db1 > db1.sql //選擇時間范圍導出
執行sql語句時報錯:
Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
解決:
SELECT @@sql_mode; 查詢出來的值為: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION 修改mysql的配置文件: vim /etc/my.cnf 加入上面查詢出來的內容,去掉ONLY_FULL_GROUP_BY eg: sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重啟mysql解決:
service mysql restart
