mysql 數據庫運維


mysql8.0 mysql5.7安裝,mysql 創建 賦權用戶
mysql8.0用戶的創建,賦權

20180628 Chenxin
20190801 Update
說明
本文檔除特殊說明處,均為8.0版本默認方式.5.7版本也支持.特殊說明處只針對mysql5.7版本.
卸載系統預裝的mysql(否則在初始化數據庫的時候無法成功):
yum remove mysql (可能需要執行2次)
which mysql (確保mysql刪除完畢)

安裝
下載安裝包
cd /opt
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz #8.0
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz #5.7

執行安裝
/usr/sbin/groupadd mysql
/usr/sbin/useradd -M -g mysql mysql -s /sbin/nolgin
yum install -y cmake ncurses-devel bison libnuma numactl libaio1 libaio-dev
tar xzvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz #根據版本調整
mv mysql-8.0.11-linux-glibc2.12-x86_64 /usr/local/mysql
mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql

修改環境變量
cat >> /etc/profile << EOF
export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
EOF
source /etc/profile

配置文件
更改/etc/my.cnf配置文件(注意編碼問題)
cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
port = 3306
user = mysql
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = error.log

關閉bin-log

skip-log-bin
binlog_expire_logs_seconds = 172800 # 5.7版本需要注釋掉

增加 為默認值的10倍

innodb_buffer_pool_size=1342177280

使用老版本的密碼認證方式,客戶端暫時不支持

default-authentication-plugin=mysql_native_password

新加的編碼,適用於5.X版本,8.X版本不知道是否適用(部分適用)

character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

default-character-set = utf8mb4 開啟會導致msyql8無法啟動

大小寫敏感,專用coinw

lower_case_table_names=1

最大連接數設置

max_connections=2000

[mysql]
default-character-set = utf8mb4

[mysql.server]
default-character-set = utf8mb4

[mysqld_safe]
default-character-set = utf8mb4

log-error=mysqld.log 同error.log,開啟會覆蓋msyqld的配置

未采用此方式啟動,不會生效.不會覆蓋mysqld配置

pid-file=mysqld.pid
初始化
8.0初始化

有密碼初始化 #mysqld --defaults-file=/etc/my.cnf --initialize

無密碼初始化 #mysqld --defaults-file=/etc/my.cnf --initialize-insecure

這里root用戶默認沒有密碼,執行: mysqld --defaults-file=/etc/my.cnf --initialize-insecure

5.7初始化

有密碼初始化 mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/

無密碼初始化 mysqld --defaults-file=/etc/my.cnf --initialize-insecure

啟動mysql
/usr/local/mysql/support-files/mysql.server start

全部搭建完成,啟動服務后可以驗證一下編碼: show variables like '%char%'; #要先初始化才能執行
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

參數說明
1.最大連接數(默認為100)
a.臨時方案,重啟失效
查看最大連接數 show variables like '%max_connections%';
修改最大連接數 set GLOBAL max_connections = 2000;
b.修改my.cnf

最大連接數設置

max_connections=2000

用戶創建與權限配置
登陸
/usr/local/mysql/bin/mysql -u root
use mysql

安全初始化方式后,默認會自動生成一個密碼,放到log文件里,比如error.log,格式類似
2019-08-01T07:30:19.871772Z 1 [Note] A temporary password is generated for root@localhost: tlq!*/4fQ
/usr/local/mysql/bin/mysql -u root -P 10306 -p
登陸后,必須先重置密碼才能執行其他指令,如下(否則報錯,由參數default_password_lifetime導致的):
alter user user() identified by "12345...6";

創建admin用戶
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'xxx';
CREATE USER 'admin'@'%' IDENTIFIED BY 'xxx';

賦權admin用戶
GRANT ALL PRIVILEGES ON . TO 'admin'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON . TO 'admin'@'%' WITH GRANT OPTION;

配置產品庫和對應用戶
CREATE DATABASE coinw01;
CREATE USER 'coinw'@'%' IDENTIFIED BY 'xxx';
CREATE USER 'coinw'@'localhost' IDENTIFIED BY 'xxx';
GRANT ALL PRIVILEGES ON coinw01.* TO 'coinw'@'%';
GRANT ALL PRIVILEGES ON coinw01.* TO 'coinw'@localhost;

創建備份賬戶
CREATE USER 'dumper'@'localhost' IDENTIFIED BY 'cvv......kkfggh[]65.,jk';
GRANT SELECT,LOCK TABLES,EVENT ON . TO 'dumper'@'localhost' WITH GRANT OPTION;

刪除多余用戶
為安全考慮,mysql的admin建議暫時只啟用本地登錄;刪除mysql中的root和test用戶:
use mysql;delete from user where user='';delete from user where user='root'; flush privileges;

查看用戶權限
use mysql;
select * from user \G;

清除DB密碼記錄的日志文件:
echo > /root/.mysql_history

數據文件分盤存儲/data分區
/data/mysql_data/data/**.
首先mv /usr/local/mysql/data /data/mysql_data/
再 ln -s /data/mysql_data/data /usr/local/mysql/data

導出表結構/導出整個庫
導出表結構(mysqldump -d dbname > xxx.sql),一般幾分鍾
mysqldump --default-character-set=utf8mb4 -uxbzj -psjErbN29h7heU8sg -P 10306 -d xlogin > xlogin.sql
mysqldump --default-character-set=utf8mb4 -h rm-m5emc856519a6ocibyo.mysql.rds.aliyuncs.com -uroot1 -p -P 3306 -d btc018_vcoin > coinw01.sql

導出整個數據,一般幾分鍾
遇到報錯mysqldump: Got error: 1066: Not unique table/alias: 'avirtualwallettransfer' when using LOCK TABLES,則添加 --single-transaction參數,如下
mysqldump --default-character-set=utf8mb4 --single-transaction -h localhost -uroot1 -p -P 3306 btc018_vcoin > coinw01.sql
另外,若導出非常慢,可以嘗試增加參數
mysqldump --default-character-set=utf8mb4 --max_allowed_packet=4194304 --net_buffer_length=16384 -ucoinw -psjE...g -P 10306 btc018_vcoin > ./btc018_vcoin.sql

導入到新建的庫中去(時間比較長)
mysql --default-character-set=utf8mb4 -ucoinw -psj....8s..g -P 10306 coinw01 < coinw01.sql # 3.5G數據導入需要2小時

問題:

這里遇到一次連接阿里雲RDS異常的情況,原因
1.因為密碼里有感嘆號,只能手動復制(放在命令行會報錯)
2.因為RDS是3306,而本地/etc/my.cnf配置client端口10306(mysql客戶端默認連接10306端口).在訪問外部3306的RDS時,務必手動指定.如 mysql -h rm-m5...rds.aliyuncs.com -uroot1 -p -P3306 (否則默認連接的會是10306)

mysqldump導出慢的解決方法:
-e 使用包括幾個VALUES列表的多行INSERT語法;
--max_allowed_packet=XXX 客戶端/服務器之間通信的緩存區的最大大小;
--net_buffer_length=XXX TCP/IP和套接字通信緩沖區大小,創建長度達net_buffer_length的行。
1.先查看目標庫的參數值 如下:
mysql> show variables like 'max_allowed_packet';
mysql> show variables like 'net_buffer_length';
2.導出時加上參數: mysqldump --max_allowed_packet=4194304 --net_buffer_length=16384 ... dbname > dbname.sql

備份
備份腳本
[xbzj@ip-10-10-0-200 ~]$ cat rds-bak/sql-xlogin-backup.sh

!/bin/bash

Des: for RDS xlogin backup to S3

20180914 Chenxin

source /etc/profile
cd /bak || mkdir -p /bak

echo "預期整個過程大約會持續10-30分鍾"
echo

DB信息

DBuser='xbzj'
DBpasswd='xxxxx'
DBhost='xlogin-read.cyp7d7zwyhrc.us-east-1.rds.amazonaws.com'
DBname='xlogin'
bktime=date +%Y%m%d%H%M%S

刪除多日前數據

find ./ -mtime +7 -name "*sql.tar.gz" -exec rm -rf {} ;
filename="$DBname"-"$bktime".sql

執行備份

touch $filename

echo "開始dump數據文件,生成臨時sql文件"
mysqldump --column-statistics=0 --opt -R -E --single-transaction --default-character-set=utf8mb4 -h $DBhost -P 10306 -u$DBuser -p$DBpasswd $DBname > $filename

若備份成功,執行壓縮和上傳至S3

if [ $? == 0 ];then
echo "sql文件dump成功,正在執行壓縮sql文件"
tar czvf "$filename".tar.gz $filename --remove-files
echo "壓縮完成,正在執行本地文件上傳至S3"
/usr/bin/aws s3 sync /bak/ s3://xbzj-data-backup/rds-xlogin-read/ --exclude '' --include 'xlogin-' --acl private --region eu-central-1
fi

mysqldump參數說明:

--column-statistics=0
僅用於mysql8,否則會報一個錯誤

--opt
等同於--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 該選項默認開啟, 可以用--skip-opt禁用.

--routines, -R
導出存儲過程以及自定義函數。

--events, -E
導出事件。

--single-transaction
保證導出的一致性狀態.該選項在導出數據之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎(它不顯示加鎖通過判斷版本來對比數據),僅InnoDB。本選項和--lock-tables 選項是互斥的,因為LOCK TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick 選項。( --quick, -q 不緩沖查詢,直接導出到標准輸出。默認為打開狀態,使用--skip-quick取消該選項。)

備份策略說明:
將此任務加到預熱服的計划任務里,每天1次備份.
加到預熱服的Jenkins里作為一個任務,供維護的時候使用.

恢復已備份的庫文件
mysql --default-character-set=utf8mb4 -h 192.168.31.129 -P 3306 -uxbzjsqladmin -p..password.. xlogin < ./xlogin-20181030152405.sql

客戶端管理工具
MySQL Workbench
mysql官方工具,支持最新的用戶加密方式,但安裝后,通過新的加密方式(默認)連接的時候會報錯,報"發生外部未知錯誤".重新在服務器上安裝mysql,並采用老的加密方式后,就可以連接了.這個工具比較全面,可以查看服務器各狀態,用戶權限等等.
https://dev.mysql.com/downloads/workbench/

Mysql-front
比較輕量級的mysql-front(不支持mysql8.0的用戶新的加密模式),當前版本6.0
http://www.mysqlfront.de/

MySQL 8.0 刪除 binlog.0000XX文件 以及 關閉log-bin功能
(注意,僅用於單機版,不能用到主從或集群模式)

參考: https://blog.csdn.net/yunuobing/article/details/74779995

關閉原因(需求):
開啟binlog記錄功能,會增加從庫磁盤I/O等的壓力,非必要開啟,請關閉。必須開啟情況:
1)級聯同步A->B->C中間的B時.
2)在從庫做數據庫備份,數據庫備份必須要有全備和binlog日志,才是完整的備份。

關閉流程: 先刪除不需要的binlog文件,然后通過配置文件關閉binlog記錄功能

1.確認當前狀態. 先登錄數據庫查詢log-bin的狀態(8.0版本默認是開啟的)。
mysql> show variables like 'log_bin';
+---------------+-------+
| log_bin | ON |
+---------------+-------+

2.手動刪除binlog
查看當前文件
mysql> show binary logs;
+---------------+------------+
| Log_name | File_size |
+---------------+------------+
| binlog.000031 | 49983 |
| binlog.000032 | 39670 |
| binlog.000033 | 1074115884 |
| binlog.000034 | 1074594937 |

刪除1天以前的
mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 1 DAY);
Query OK, 0 rows affected (0.05 sec)

確認刪除是否生效
mysql> show binary logs;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000086 | 802811016 |
| binlog.000087 | 155 |
+---------------+-----------+
2 rows in set (0.00 sec)

刪除指定某個文件之前的所有日志
mysql> PURGE MASTER LOGS TO 'binlog.000087';
Query OK, 0 rows affected (0.19 sec)

確認刪除是否生效
mysql> show binary logs;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000087 | 155 |
+---------------+-----------+
1 row in set (0.00 sec)

3.修改配置文件
編輯my.cnf文件,一般路徑為:/etc/my.cnf
在mysqld下面添加:skip-log-bin 或者disable-log-bin(未測試)

4.重啟Mysql.
/usr/local/mysql/support-files/mysql.server restart

5.確認狀態修改是否成功
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)

再次查看binlog,則會報錯(因為關閉了):
mysql> show binary logs;
ERROR 1381 (HY000): You are not using binary logging

mysql> show variables like 'expire_log%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'binlog_expire_logs_seconds';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| binlog_expire_logs_seconds | 172800 |
+----------------------------+--------+
1 row in set (0.00 sec)

附,對應的my.cnf配置文件:
[root@localhost data]# cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
port = 3306
user = mysql
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = error.log

關閉bin-log

skip-log-bin

關閉后,過期時間就無所謂了

binlog_expire_logs_seconds = 172800

使用老版本的密碼認證方式,客戶端暫時不支持

default-authentication-plugin=mysql_native_password

新加的編碼,適用於5.X版本,8.X版本不知道是否適用

character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

default-character-set = utf8mb4 開啟會導致msyql8無法啟動

[mysql]
default-character-set = utf8mb4

[mysql.server]
default-character-set = utf8mb4

[mysqld_safe]
default-character-set = utf8mb4

log-error=mysqld.log 同error.log

pid-file=mysqld.pid

擴展知識
mysql8.0用戶的創建,賦權
20180628 Chenxin
mysql8在創建用戶賦權跟以前的版本有所不同.

配置老的加密方式-配置文件my.cnf
因目前mysql8最新的用戶驗證方式,很多客戶端不支持,且目前來看,不是很推薦(貌似亂碼).修改回老的認證方式的話,my.cnf文件配置:
default-authentication-plugin=mysql_native_password

創建用戶與賦權用戶
create user '用戶'@'主機' identified by '密碼';
grant 權限 on 數據庫 to '用戶'@'主機'

會報錯的寫法:(過去都是這種寫法-無需create)
GRANT ALL PRIVILEGES ON . TO 'admin'@'localhost' IDENTIFIED BY 'xxx';
報錯信息:Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'xxx” at line 1
正確的寫法:
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'xxx';
GRANT ALL PRIVILEGES ON . TO 'admin'@'localhost';

不推薦:GRANT ALL PRIVILEGES ON . TO 'admin'@'localhost' WITH GRANT OPTION;

可見,在授權的語句中需要去掉 IDENTIFIED BY 'password';其中,關鍵字 “privileges” 可以省略.

WITH GRANT OPTION說明
讓授權的用戶可以將這些權限 grant 給其他用戶.這個特性一般用不到.實際中,數據庫權限最好由 DBA 來統一管理.
grant, revoke 用戶權限后,該用戶只有重新連接 MySQL 數據庫,權限才能生效.

grant 增刪改查.
grant insert,delete,update,select on testdb.* to common_user@'%'

grant 作用在整個 MySQL 服務器上:
grant all on . to dba@localhost; — dba 可以管理 MySQL 中的所有數據庫

grant 作用在存儲過程.函數上:
grant execute on procedure testdb.pr_add to ‘dba'@'localhost'
grant execute on function testdb.fn_add to ‘dba'@'localhost'

單獨授予某種權限的寫法:
GRANT SELECT ON db.table TO 'test'@'localhost';

更新用戶密碼
mysql-8
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
說明:(上一個版本使用以下)
mysql-5
use mysql
update user set password=password('as..password...2') where user='mysqladmin' and host='%';
flush privileges;

查看用戶權限(幾種方式)
select host, user, authentication_string, plugin from user;
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
select * from user \G; (如果采用新加密方式,輸出非常容易亂碼,造成控制台異常.不知道對數據是否有影響.之后重裝了)

查看某個用戶對哪些庫擁有權限
show grants for 'xbzjsqladmin'@'localhost';
顯示:GRANT USAGE ON . TO xbzjsqladmin@localhost #這里USAGE是無權限的意思
對於GRANT USAGE ON:
mysql> GRANT USAGE ON . TO 'name'@'localhost';
一個賬戶有用戶名name,沒有密碼.該賬戶只用於從本機連接.未授予權限.通過GRANT語句中的USAGE權限,你可以創建賬戶而不授予任何權限.它可以將所有全局權限設為'N'.假定你將在以后將具體權限授予該賬戶.

查看當前用戶權限
show grants;

收回權限
revoke 跟 grant 的語法差不多,只需要把關鍵字 “to” 換成 “from” 即可:
revoke all on . from 'admin'@'%';
REVOKE只能取消用戶權限,而不能刪除用戶.
即使取消了所有的權限,用戶仍然可以連接到服務器.
要想徹底的刪除用戶,必須使用DELETE語句將該用戶的記錄從MySQL數據庫中的user表中刪除.
該語句的語法格式如下:
Delete from user where user = "user_name" and host = "host_name" ;
再比如:
delete from user where user='';
delete from user where user='root';
flush privileges;

刷新權限-所有操作后,應執行
flush privileges;

備注1
grant經常給開發人員的權限
創建表.索引.視圖.存儲過程.函數等權限.

grant 創建.修改.刪除 MySQL 數據表結構權限.
grant create on testdb.* to developer@'192.168.0.%';
grant alter on testdb.* to developer@'192.168.0.%';
grant drop on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 外鍵權限.
grant references on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 臨時表權限.
grant create temporary tables on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 索引權限.
grant index on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 視圖.查看視圖源代碼 權限.
grant create view on testdb.* to developer@'192.168.0.%';
grant show view on testdb.* to developer@'192.168.0.%';

grant 操作 MySQL 存儲過程.函數 權限.
grant create routine on testdb.* to developer@'192.168.0.%';
grant alter routine on testdb.* to developer@'192.168.0.%';
grant execute on testdb.* to developer@'192.168.0.%';

備注2
mysql授權表共有5個表

user表
列出可以連接服務器的用戶及其口令,並且它指定他們有哪種全局(超級用戶)權限.
在user表啟用的任何權限均是全局權限,並適用於所有數據庫.
例如,如果你啟用了DELETE權限,在這里列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮.

db表
db表列出數據庫,而用戶有權限訪問它們.在這里指定的權限適用於一個數據庫中的所有表.

host表
host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些.
這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它.

tables_priv表
tables_priv表指定表級權限,在這里指定的一個權限適用於一個表的所有列.

columns_priv表
columns_priv表指定列級權限.這里指定的權限適用於一個表的特定列.

擴展知識2-msyql的啟動方式與匹配的配置文件
一、MySQL讀取配置文件的順序
讀取順序:/etc/my.cnf > /etc/mysql/my.cnf > /usr/etc/my.cnf > ~/.my.cnf
命令驗證:
[root@mysql ~]# mysql --verbose --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

二、MySQL啟動方式
MySQL的啟動方式通常分成三種:mysqld、mysqld_safe、mysqld_multi(主要用於多實例啟動)

三種方式的關系:
首先當我們使用service mysqld start或者/etc/init.d/mysqld start這樣的方式啟動的時候,其實是使用了mysql.server這個腳本,這個腳本默認會調用mysqld_safe來啟動mysqld,所以通常我們啟動mysql之后查看進程的時候會發現有mysqld和mysqld_safe這兩個進程存在。這兩種通常都是單實例的啟動方式,當然也可以使用mysqld來啟動多實例的。而mysqld_multi用來啟動多實例,也是通過先調用mysqld_safe和mysqld來啟動mysql的。

三、MySQL啟動原理
默認的mysql的服務啟動程序是mysql.server,mysql.server程序主要是會用到兩個程序和一個函數,分別是my_print_defaults、myslqd_safe和parse_server_arguments
1、my_print_defaults:讀取my.cnf配置文件,輸出參數傳遞給parse_server_arguments,該程序只讀my.cnf中[mysqld]中的參數。
2、parse_server_arguments:該函數處理my_print_defaults傳遞過來的參數賦值給--basedir、--datadir、--pid-file、--server-startup-timeout
3、myslqd_safe:mysqld_safe程序調用mysqld程序來啟動mysql服務,[mysqld_safe]會覆蓋mysqld部分中的參數
4、mysqld_multi會讀取配置文件中的[mysqld_muti],[mysqldN]下面的參數,N需要時一個整數,建議用端口號表示,該部分的配置會覆蓋[mysqld]部分中的配置
5、在mysqld進程掛掉的時候,mysqld_safe進程會監測到並重新將mysqld啟動起來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM