mysql進階
1. 二進制格式mysql安裝
#wget下載二進制格式的mysql軟件包
[root@node01-linux ~]# cd /usr/src/
[root@node01-linux src]# ls
debug kernels
[root@node01-linux src]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
[root@node01-linux src]# ls
debug kernels mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
#創建用戶和組
[root@node01-linux ~]# groupadd -r -g 306 mysql
[root@node01-linux ~]# useradd -r -M -s /sbin/nologin -u 306 -g 306 mysql
#解壓軟件至/usr/local/
[root@node01-linux ~]# ls /usr/local/
bin etc games include lib lib64 libexec sbin share src
[root@node01-linux src]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ //解壓
[root@node01-linux ~]# ls /usr/local/
bin games lib libexec sbin src
etc include lib64 mysql-5.7.30-linux-glibc2.12-x86_64 share
#進/usr/local/ 建立軟連接
[root@node01-linux ~]# cd /usr/local/
[root@node01-linux local]# ln -sv mysql-5.7.30-linux-glibc2.12-x86_64/ mysql
‘mysql’ -> ‘mysql-5.7.30-linux-glibc2.12-x86_64/’
[root@node01-linux local]# ll
···
lrwxrwxrwx. 1 root root 36 Jun 12 12:06 mysql -> mysql-5.7.30-linux-glibc2.12-x86_64/
drwxr-xr-x. 9 root root 129 Jun 12 11:57 mysql-5.7.30-linux-glibc2.12-x86_64
···
#修改目錄/usr/local/mysql的屬主屬組
[root@node01-linux local]# chown -R mysql.mysql mysql*
[root@node01-linux local]# ll
···
lrwxrwxrwx. 1 mysql mysql 36 Jun 12 12:06 mysql -> mysql-5.7.30-linux-glibc2.12-x86_64/
drwxr-xr-x. 9 mysql mysql 129 Jun 12 11:57 mysql-5.7.30-linux-glibc2.12-x86_64
···
#添加環境變量
[root@node01-linux ~]# ls /usr/local/mysql
bin docs include lib LICENSE man README share support-files
[root@node01-linux ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@node01-linux ~]# . /etc/profile.d/mysql.sh //讀取文件
[root@node01-linux ~]# echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@node01-linux ~]# which mysql
/usr/local/mysql/bin/mysql
#建立數據存放目錄
[root@node01-linux ~]# mkdir /opt/mysqldata
[root@node01-linux ~]# chown -R mysql.mysql /opt/mysqldata/
[root@node01-linux ~]# ll -d /opt/mysqldata/
drwxr-xr-x. 2 mysql mysql 6 Jun 12 16:08 /opt/mysqldata/
#初始化數據庫
[root@node01-linux ~]# yum list all|grep aio
[root@node01-linux ~]# yum -y install libaio-devel //裝libaio-devel包
[root@node01-linux ~]# mysqld --initialize --user=mysql --datadir=/opt/mysqldata
···
2020-06-12T08:39:12.553371Z 1 [Note] A temporary password is generated for root@localhost: &dVnnnznT6kZ
#★★★★★注意,這個密碼是隨機的,一定要記住這個密碼,因爲一會登錄時會用到★★★★★
[root@node01-linux ~]# echo '&dVnnnznT6kZ' > passwd
#生成配置文件
[root@node01-linux ~]# > /etc/my.cnf //清空內容
[root@node01-linux ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql //數據庫安裝路徑
datadir = /opt/mysqldata //數據存放目錄
socket = /tmp/mysql.sock //套接字文件存放目錄
port = 3306 //端口號
pid-file = /opt/mysqldata/mysql.pid //進程id存放目錄
user = mysql //指定用戶
skip-name-resolve //禁止域名解析(當然,也包括主機名)
#配置服務啓動腳本
[root@node01-linux ~]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@node01-linux ~]# vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/opt/mysqldata
★★★★★或者★★★★★
[root@node01-linux ~]# sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
[root@node01-linux ~]# sed -ri 's#^(datadir=).*#\1/opt/mysqldata#g' /etc/init.d/mysqld
#啓動mysql
[root@node01-linux ~]# service mysqld start //啓動
[root@node01-linux ~]# chkconfig mysqld on //設置開機自啓
Starting MySQL.Logging to '/opt/mysqldata/node01-linux.example.com.err'.
SUCCESS!
[root@node01-linux ~]# ss -antl
···
LISTEN 0 80 :::3306 :::*
#修改密碼,使用臨時密碼登錄
[root@node01-linux ~]# mysql -uroot -p'&dVnnnznT6kZ'
mysql> set password = password('mysql123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> quit
2. mysql配置文件
mysql
的配置文件爲 /etc/my.cnf
配置文件查找次序:若在多個配置文件中均有設定,則最後找到的最終生效
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
#mysql免密、 mysqldump免密
[root@node01-linux ~]# vim .my.cnf
[client]
user=root
password=mysql123456
[mysqldump]
user=root
password=mysql123456
[root@node01-linux ~]# mysql -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql常用配置文件參數:
參數 | 說明 |
---|---|
port = 3306 | 設置監聽端口 |
socket = /tmp/mysql.sock | 指定套接字文件位置 |
basedir = /usr/local/mysql | 指定MySQL的安裝路徑 |
datadir = /data/mysql | 指定MySQL的數據存放路徑 |
pid-file = /data/mysql/mysql.pid | 指定進程ID文件存放路徑 |
user = mysql | 指定MySQL以什麼用戶的身份提供服務 |
skip-name-resolve | 禁止MySQL對外部連接進行DNS解析 使用這一選項可以消除MySQL進行DNS解析的時間。 若開啓該選項,則所有遠程主機連接授權都要使用IP地址方 式否則MySQL將無法正常處理連接請求 |
3. mysql數據庫備份與恢復
3.1 數據庫常用備份方案
數據庫備份方案:
- 全量備份
- 增量備份
- 差異備份
備份方案 | 特點 |
---|---|
全量備份 | 全量備份就是指對某一個時間點上的所有數據或應用進行的一個完全拷貝。 數據恢復快。 備份時間長 |
增量備份 | 增量備份是指在一次全備份或上一次增量備份後,以後每次的備份只需備份 與前一次相比增加和者被修改的文件。這就意味着,第一次增量備份的對象 是進行全備後所產生的增加和修改的文件;第二次增量備份的對象是進行第一次增量 備份後所產生的增加和修改的文件,如此類推。 沒有重複的備份數據 備份時間短 恢復數據時必須按一定的順序進行 |
差異備份 | 備份上一次的完全備份後發生變化的所有文件。 差異備份是指在一次全備份後到進行差異備份的這段時間內 對那些增加或者修改文件的備份。在進行恢復時,我們只需對第一次全量備份和最後一次差異備份進行恢復。 |
3.2 mysql備份工具mysqldump
#語法:
mysqldump [OPTIONS] database [tables ...]
mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
#常用的OPTIONS:
-uUSERNAME //指定數據庫用戶名
-hHOST //指定服務器主機,請使用ip地址
-pPASSWORD //指定數據庫用戶的密碼
-P# //指定數據庫監聽的端口,這裏的#需用實際的端口號代替,如-P3307
mysql> show databases; //查看庫
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> show tables; //查看錶
+------------------+
| Tables_in_school |
+------------------+
| student |
| teacher |
+------------------+
2 rows in set (0.00 sec)
#備份整個數據庫(全備)
[root@node01-linux ~]# mysqldump -uroot -pmysql123456 --all-databases > all-20206131130.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@node01-linux ~]# ls
all-20206131130.sql anaconda-ks.cfg passwd
#備份school庫的teacher表
[root@node01-linux ~]# mysqldump -uroot -pmysql123456 school teacher > teacher-202006131150.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@node01-linux ~]# ls
all-20206131130.sql anaconda-ks.cfg passwd teacher-202006131150.sql
#備份school庫裏面所有的表
[root@node01-linux ~]# mysqldump school > school-202006131205.sql
[root@node01-linux ~]# ls
all-20206131130.sql passwd teacher-202006131150.sql
anaconda-ks.cfg school-202006131205.sql
#備份school庫
[root@node01-linux ~]# mysqldump --databases school > school-202006131505.sql
[root@node01-linux ~]# ls
all-20206131130.sql passwd school-202006131505.sql
anaconda-ks.cfg school-202006131205.sql teacher-202006131150.sql
#模擬刪除school數據庫
mysql> drop database school;
Query OK, 2 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
3.3 mysql數據恢復
#恢復school數據庫
[root@node01-linux ~]# ls
all-20206131130.sql anaconda-ks.cfg passwd
[root@node01-linux ~]# mysql < school-202006131505.sql
[root@node01-linux ~]# mysql -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
#恢復school數據庫裏面的teacher表
mysql> use school;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
mysql> source teacher-202006131150.sql;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
···
#★★★★★或者★★★★★
[root@node01-linux ~]# mysql school < teacher-202006131150.sql
#★★★★★模擬刪除整個數據庫★★★★★
mysql> drop database school;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
#恢復整個數據庫
[root@node01-linux ~]# ls
all-20206131130.sql passwd school-202006131505.sql
anaconda-ks.cfg school-202006131205.sql teacher-202006131150.sql
[root@node01-linux ~]# mysql < all-20206131130.sql
[root@node01-linux ~]# mysql -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
3.4 差異備份與恢復
3.4.1. mysql差異備份
[root@node01-linux ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/mysqldata
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/mysqldata/mysql.pid
user = mysql
skip-name-resolve
server-id = 1 //設置服務器標識符
log-bin = mysql.bin //開啓二進制日誌功能
[root@node01-linux ~]# service mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL.. SUCCESS!
[root@node01-linux ~]# ls /opt/mysqldata/
mysql.000001 mysql.index
對數據庫進行完全備份
[root@node01-linux ~]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
| teacher |
+------------------+
2 rows in set (0.00 sec)
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 20 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
+----+----------+------+
5 rows in set (0.00 sec)
mysql> select * from teacher;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | bj | 28 |
| 2 | sh | 33 |
| 3 | gz | 26 |
| 4 | sz | 40 |
| 5 | wh | 20 |
+----+------+------+
5 rows in set (0.00 sec)
#完全備份
[root@node01-linux ~]# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all-202006131650.sql
#增加新內容
[root@node01-linux ~]# mysql
mysql> use school;
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 20 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
+----+----------+------+
5 rows in set (0.00 sec)
mysql> insert student(name,age) values('runtime',28); //新增runtime
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 20 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
| 6 | runtime | 28 |
+----+----------+------+
6 rows in set (0.00 sec)
mysql> update student set age = 50 where name = 'zhangsan'; //修改zhangsan年齡
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 50 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
| 6 | runtime | 28 |
+----+----------+------+
6 rows in set (0.00 sec)
3.4.2. mysql差異備份恢復
模擬誤刪數據
mysql> drop database school;
Query OK, 2 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
刷新創建新的二進制日誌
[root@node01-linux ~]# ll /opt/mysqldata/
-rw-r-----. 1 mysql mysql 884 Jun 13 17:04 mysql.000002
-rw-r-----. 1 mysql mysql 15 Jun 13 16:52 mysql.index
···
[root@node01-linux ~]# cat /opt/mysqldata/mysql.index
./mysql.000002
#刷新創建新的二進制日誌
[root@node01-linux ~]# mysqladmin -uroot -pmysql123456 flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@node01-linux ~]# ll /opt/mysqldata/
-rw-r-----. 1 mysql mysql 927 Jun 13 17:10 mysql.000002
-rw-r-----. 1 mysql mysql 154 Jun 13 17:10 mysql.000003
-rw-r-----. 1 mysql mysql 30 Jun 13 17:10 mysql.index
···
恢復完全備份
[root@node01-linux ~]# mysql < all-202006131650.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use school;
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
| teacher |
+------------------+
2 rows in set (0.00 sec)
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 20 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
+----+----------+------+
5 rows in set (0.00 sec)
mysql> select * from teacher;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | bj | 28 |
| 2 | sh | 33 |
| 3 | gz | 26 |
| 4 | sz | 40 |
| 5 | wh | 20 |
+----+------+------+
5 rows in set (0.00 sec)
恢復差異備份
[root@node01-linux ~]# ll /opt/mysqldata/
-rw-r-----. 1 mysql mysql 927 Jun 13 17:10 mysql.000002
-rw-r-----. 1 mysql mysql 833536 Jun 13 17:13 mysql.000003
···
[root@node01-linux ~]# mysql
mysql> show binlog events in 'mysql.000002';
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql.000002 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysql.000002 | 123 | Previous_gtids | 1 | 154 | |
| mysql.000002 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql.000002 | 219 | Query | 1 | 293 | BEGIN |
| mysql.000002 | 293 | Table_map | 1 | 349 | table_id: 140 (school.student) |
| mysql.000002 | 349 | Write_rows | 1 | 398 | table_id: 140 flags: STMT_END_F |
| mysql.000002 | 398 | Xid | 1 | 429 | COMMIT /* xid=483 */ |
| mysql.000002 | 429 | Anonymous_Gtid | 1 | 494 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql.000002 | 494 | Query | 1 | 568 | BEGIN |
| mysql.000002 | 568 | Table_map | 1 | 624 | table_id: 140 (school.student) |
| mysql.000002 | 624 | Update_rows | 1 | 690 | table_id: 140 flags: STMT_END_F |
| mysql.000002 | 690 | Xid | 1 | 721 | COMMIT /* xid=485 */ |
| mysql.000002 | 721 | Anonymous_Gtid | 1 | 786 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql.000002 | 786 | Query | 1 | 884 | drop database school |
| mysql.000002 | 884 | Rotate | 1 | 927 | mysql.000003;pos=4 |
+--------------+-----+----------------+-----------+-------------+---------------------------------------+
15 rows in set (0.00 sec)
#使用mysqlbinlog恢復差異備份
[root@node01-linux ~]# mysqlbinlog --stop-position=786 /opt/mysqldata/mysql.000002 |mysql -uroot -pmysql123456
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> select * from student;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 1 | tom | 12 |
| 2 | jerry | 16 |
| 3 | zhangsan | 50 |
| 4 | lisi | 24 |
| 5 | wangwu | 26 |
| 6 | runtime | 28 |
+----+----------+------+
6 rows in set (0.00 sec)