2019-05-13 MySQL數據庫日志與企業應用實踐

1. MySQL常用日志文件知識

MySQL日志種類

MySQL常用日志種類

默認情況下,以上所有的日志都處于非激活狀態(Linux環境)。當激活日志時,所有的日志都默認配置在數據文件的目錄下。管理員也可以對上述日志進行輪詢切割,實現該功能常見的命令是mysqladmin flush-logs、mysqldump的“-F”或“--master-data”參數等。

2. 錯誤日志的介紹與配置

1. 錯誤日志的介紹

MySQL的錯誤日志用于記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息。

2. 錯誤日志的記錄配置

MySQL的錯誤日志通常由mysqld或mysqld_safe程序產生。可以利用如下方法配置記錄MySQL錯誤日志。
方法1:在my.cnf配置文件中調整,注意,是在[mysqld_safe]模塊的下面進行配置:

[mysqld_safe]
log_error = /application/mysql-5.6.41/data/oldboy.err

方法2:在啟動MySQL服務的命令里加入記錄錯誤日志的參數:

mysql_safe --log-error=/application/mysql-5.6.41/data/oldboy.err &

注意:沒有該文件的話需要自行創建并賦予mysql權限
查看到的最終結果為:

mysql> show variables like '%log_error%';
+---------------------+-------------------------------------------+
| Variable_name       | Value                                     |
+---------------------+-------------------------------------------+
| binlog_error_action | IGNORE_ERROR                              |
| log_error           | /application/mysql-5.6.41/data/oldboy.err |
+---------------------+-------------------------------------------+
2 rows in set (0.00 sec)
[root@oldboy ~]# tail -4 /application/mysql/data/oldboy.err 
2019-05-05 04:23:24 13047 [Note] Server socket created on IP: '::'.
2019-05-05 04:23:24 13047 [Note] Event Scheduler: Loaded 0 events
2019-05-05 04:23:24 13047 [Note] /application/mysql/bin/mysqld: ready for connections.
Version: '5.6.41-log'  socket: '/application/mysql-5.6.41/tmp/mysql.sock'  port: 3306  Source distribution

3. 錯誤日志輪詢

管理員可以使用命令輪詢錯誤日志,例如可以按天輪詢:

[root@oldboy ~]# cd /application/mysql/data    ---切換到日志目錄下
[root@oldboy data]# mv oldboy.err oldboy_$(date +%F).err    ---將錯誤日志按天移動改名
[root@oldboy data]# mysqladmin flush-logs    ---執行刷新日志命令
[root@oldboy data]# ll oldboy.err     ---新的錯誤日志誕生了
-rw-rw----. 1 mysql mysql 0 May  5 04:30 oldboy.err

4. 數據庫故障排查案例分析

新手安裝數據庫時,遇到數據庫無法啟動時的排查方法具體如下:
1)先清空錯誤日志文件,然后重新啟動MySQL服務,再查看日志文件報什么錯誤,并根據錯誤日志進行處理。
2)如果無法解決,則刪除數據文件,重新初始化數據庫。
假設在排查故障時,得到的錯誤日志提示為:

180321  17:36:26  InnoDB:Completed initialization of buffer pool
180321  17:36:26    InnoDB:Operating system error number 13 in a file operation.
InnoDB:The error means mysqld does not have the access rights to
InnoDB:the directory.
InnoDB:File name ./ibdata1

根據提示可知,該錯誤是權限問題導致的問題,可對數據目錄遞歸執行權限,然后再重啟數據庫:

[root@oldboy data]# chown -R mysql.mysql /application/mysql/data/

3. 普通查詢日志的介紹與配置

1. 普通查詢日志的介紹

普通查詢日志的作用是記錄客戶端連接信息,以及執行的SQL語句信息。

2. 普通查詢日志的功能配置

可能官方考慮到普通查詢日志的重要性比較低,因此默認情況下普通查詢日志是關閉狀態:

mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | OFF                                |
| general_log_file | /application/mysql/data/oldboy.log |
+------------------+------------------------------------+
2 rows in set (0.00 sec)

可以執行在線修改的命令使其臨時生效:

mysql> set global general_log = on;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like 'general_log%';
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| general_log      | ON                                 |
| general_log_file | /application/mysql/data/oldboy.log |
+------------------+------------------------------------+
2 rows in set (0.03 sec)

如果希望永久生效,則可以把參數寫入my.cnf的配置文件里的[mysqld]模塊下:

general_log = on
general_log_file = /application/mysql-5.6.41/data/oldboy.log

3. 普通查詢日志示例

可在執行幾個操作后,觀察查詢日志文件的變化:

[root@oldboy data]# tail oldboy.log 
/application/mysql/bin/mysqld, Version: 5.6.41-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /application/mysql-5.6.41/tmp/mysql.sock
Time                 Id Command    Argument
190505  5:09:38     3 Query show variables like 'general_log%'
190505  5:10:28     3 Query show variables like 'log_error%'
190505  5:12:52     3 Quit

4. 普通查詢日志的生產使用建議

在高并發數據庫的場景下,普通查詢日志應該是關閉狀態的(默認也是關閉的),主要是因為查詢日志的信息量很大,容易導致磁盤I/O性能問題。當訪問量不是很大,而企業又有審計執行的SQL語句的需求時,可以考慮開啟該功能。

4. 二進制日志的介紹與配置

1. 二進制日志的介紹

二進制日志的作用是記錄數據庫里的數據被修改的SQL語句,一般為DDL和DML語句,例如含有insert、update、delete、create、drop、alter等關鍵字的語句。

2. 二進制日志的作用

二進制日志最重要的作用有2個,具體如下:
第一個是記錄MySQL數據的增量數據,用來做增量數據庫恢復,沒有二進制日志功能,MySQL的備份將無法完整還原數據。
第二個是實現主從復制功能。

3. 二進制日志的配置

[root@oldboy data]# grep log_bin /etc/my.cnf
log_bin
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |    ---記錄binlog開關
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |    ---記錄binlog開關
| sql_log_bin   | ON    |    ---臨時不記錄binlog開關
+---------------+-------+
2 rows in set (0.00 sec)

4. 二進制日志文件的刷新條件

1)數據庫重啟會自動刷新binlog為新文件
2)執行“mysqldump -F”或“mysqldump flush-logs”會將binlog刷新為新文件
3)binlog文件達到1GB左右時,會自動刷新binlog為新文件
4)人為配置切割參數及調整
binlog最大值控制參數及默認大小查看方法如下:

mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.03 sec)

5. 二進制日志索引文件

除了很多按序列生成的binlog文件列表之外,還有一個索引文件,例如下文里的oldboy-bin.index:

[root@oldboy logs]# pwd
/application/mysql/logs
[root@oldboy logs]# ll oldboy-bin.*
-rw-rw----. 1 mysql mysql    2409 May  4 11:42 oldboy-bin.000003
-rw-rw----. 1 mysql mysql     611 May  4 13:15 oldboy-bin.000004
-rw-rw----. 1 mysql mysql   69414 May  4 13:17 oldboy-bin.000005
-rw-rw----. 1 mysql mysql 1396515 May  4 13:17 oldboy-bin.000006
-rw-rw----. 1 mysql mysql     143 May  4 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql     120 May  4 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql     143 May  5 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql     168 May  5 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql     211 May  5 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql     378 May  5 04:30 oldboy-bin.index

索引文件的文件名和binlog文件一樣,只是擴展名為index,查看索引文件內容的命令如下:

[root@oldboy data_ori]# cat oldboy-bin.index 
./oldboy-bin.000001
./oldboy-bin.000002
./oldboy-bin.000003

binlog索引文件的控制參數為:

mysql> show variables like 'log_bin_index';
+---------------+------------------------------------------+
| Variable_name | Value                                    |
+---------------+------------------------------------------+
| log_bin_index | /application/mysql/logs/oldboy-bin.index |
+---------------+------------------------------------------+
1 row in set (0.00 sec)

6. 刪除二進制日志的方法

binlog日志很重要,不能隨意清除。那么如何正確刪除binlog文件呢?
首先,要確定什么時候可以刪除binlog。理論上每天的數據庫全備時刻以前的binlog都是無用的,但是工作中我們會根據需要保留3~7天的本地binlog文件。
以下是具體的刪除方式:
(1)設置參數自動刪除binlog
設置參數自動刪除binlog是每個管理員都應該做的。設置示例如下:

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)
mysql> set global expire_logs_days = 7;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 7     |
+------------------+-------+
1 row in set (0.00 sec)

[root@oldboy logs]# grep expir /etc/my.cnf
expire_logs_days = 7

(2)從最開始一直刪除到指定的文件位置(不含指定文件)
這種方法一般用于處理臨時的需求,操作如下:

[root@oldboy logs]# cp oldboy-bin.* /tmp/

登錄數據庫時執行如下命令:

mysql> show binary logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| oldboy-bin.000003 |      2409 |
| oldboy-bin.000004 |       611 |
| oldboy-bin.000005 |     69414 |
| oldboy-bin.000006 |   1396515 |
| oldboy-bin.000007 |       143 |
| oldboy-bin.000008 |       120 |
| oldboy-bin.000009 |       143 |
| oldboy-bin.000010 |       168 |
| oldboy-bin.000011 |       211 |
+-------------------+-----------+
9 rows in set (0.00 sec)
mysql> purge binary logs to 'oldboy-bin.000004';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| oldboy-bin.000004 |       611 |    ---序列000004以前的就沒了
| oldboy-bin.000005 |     69414 |
| oldboy-bin.000006 |   1396515 |
| oldboy-bin.000007 |       143 |
| oldboy-bin.000008 |       120 |
| oldboy-bin.000009 |       143 |
| oldboy-bin.000010 |       168 |
| oldboy-bin.000011 |       211 |
+-------------------+-----------+
8 rows in set (0.00 sec)

(3)按照時間刪除binlog日志
這種方法也是用于臨時的需求,操作如下:

[root@oldboy logs]# ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql     611 2019-05-04 13:15 oldboy-bin.000004
-rw-rw----. 1 mysql mysql   69414 2019-05-04 13:17 oldboy-bin.000005
-rw-rw----. 1 mysql mysql 1396515 2019-05-04 13:17 oldboy-bin.000006
-rw-rw----. 1 mysql mysql     143 2019-05-04 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql     120 2019-05-04 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql     143 2019-05-05 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql     168 2019-05-05 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql     211 2019-05-05 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql     336 2019-05-05 13:35 oldboy-bin.index

下面刪除“2019-05-04 13:27”以前的binlog文件:

mysql> PURGE MASTER LOGS BEFORE '2019-05-04 13:27';
Query OK, 0 rows affected (0.08 sec)
mysql> system ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql 143 2019-05-04 13:27 oldboy-bin.000007
-rw-rw----. 1 mysql mysql 120 2019-05-04 13:28 oldboy-bin.000008
-rw-rw----. 1 mysql mysql 143 2019-05-05 04:22 oldboy-bin.000009
-rw-rw----. 1 mysql mysql 168 2019-05-05 04:30 oldboy-bin.000010
-rw-rw----. 1 mysql mysql 211 2019-05-05 13:00 oldboy-bin.000011
-rw-rw----. 1 mysql mysql 210 2019-05-05 13:42 oldboy-bin.index

(4)清除所有的binlog,并從000001開始重新記錄

mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> system ls -l --time-style=long-iso oldboy-bin*
-rw-rw----. 1 mysql mysql 120 2019-05-05 13:44 oldboy-bin.000001
-rw-rw----. 1 mysql mysql  42 2019-05-05 13:44 oldboy-bin.index

下面是binlog相關參數的設置和優化思路
使用如下命令可以查看binlog相關參數:

mysql> show variables like 'binlog_%';
mysql> show variables like '%log_bin%';

工作中比較常用的參數:
(1)binlog_cache_size
二進制日志緩存是數據庫為每一個客戶連接分配的內存空間。對于事務引擎來說,適當調整該參數會獲得更好的性能,該參數的默認值為:

mysql> show variables like '%binlog_cache%';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| binlog_cache_size     | 32768                |
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
2 rows in set (0.00 sec)

(2)max_binlog_size
該參數用于設置binlog日志的最大大小,默認為1GB,但是該值并不能嚴格控制binlog的大小。若binlog大小接近1GB,而此時又在執行一個較大的事務,那么為了保證事務的完整性,數據庫不會做日志刷新動作,而是直到該事務的日志全部記錄進入當前binlog日志后才會進行刷新。該參數的默認值查詢結果為:

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

(3)sync_binlog
這個參數的作用是控制binlog什么時候同步到磁盤。對數據庫來說,這是很重要的參數,它不僅會影響數據庫的性能,還會影響數據庫數據的完整性。

  • “sync_binlog=0”表示在事務提交之后,數據庫不會將binlog_cache中的數據刷新到磁盤,而是讓文件系統自行決定什么時候來做刷新或者在緩存滿了之后才刷新到磁盤。
  • “sync_binlog=n”表示每進行n次事務提交之后,數據庫都會進行一次將緩存數據強制刷新到磁盤的操作。
    該參數默認的設置是0,示例如下:
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 0     |
+---------------+-------+
1 row in set (0.00 sec)

設置為0時數據庫的性能是最好的,但數據風險也是最大的,對于數據安全性要求較高的數據庫,應該調整該參數將其改為1,值得注意的是,即使參數設置為1,仍然有binlog記錄的內容與數據庫的實際內容不一致的風險。

7. 記錄二進制日志的三種模式

(1)語句模式
語句(statement-based)模式是MySQL5.6版本默認的模式,就是每一條被修改的數據的SQL語句都會記錄到master的binlog中。在復制slave庫的時候,SQL進程會解析成與原來master端執行過的相同的SQL來再次執行。
該模式的優點是不需要記錄細到每一行數據的更改變化,因此,可減少binlog日志量,實際上是減少了很多,節約了磁盤I/O,提高了系統性能。而缺點是由于語句模式記錄的是執行的SQL語句,所以,對于某些具有特殊功能的SQL來說,就可能會導致無法在從庫上正確執行,從而導致主從庫數據不一致的問題。
例如,當特殊的函數被執行時,當觸發器、存儲過程等特殊功能被執行時,而row level模式是基于每一行來記錄變化的,所以不會出現類似的問題。
(2)行級模式
行級(row-based)模式就是將數據被修改的每一行的情況記錄為一條語句。
優點:在行級模式下,binlog中可以不記錄執行的SQL語句的上下文相關信息,僅僅記錄哪一條記錄被修改了,修改成什么樣了即可,所以row level的日志內容會非常清楚地記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程或function以及trigger的調用和觸發無法被正確復制的問題。
缺點:行級模式下,所有的執行語句都將根據修改的行來記錄,而這就可能會產生大量的日志內容,例如一條語句修改了100萬行,語句模式就用一條語句即可搞定,而行級模式執行之后,日志中記錄的就是100萬行的修改記錄,binlog日志的量可能會大得驚人。
(3)混合模式
混合(mixed-based)模式默認采用語句模式記錄日志,在一些特定的情況下會將記錄模式切換為行級模式記錄,這些特殊情況包含但不限于以下情況。

  • 當函數中包含UUID()時
  • 當表中有自增列(AUTO_INCREMENT)被更新時
  • 當FOUND_ROWS()、ROW_COUNT()、USER()、CURRENT_USER()、CURRENT_USER等執行時。

8. 企業中如何選擇二進制日志模式

在互聯網公司中,使用MySQL的特殊功能比較少(存儲過程、觸發器、函數),此時可以選擇默認的語句模式。
如果公司較多用到MySQL的特殊功能,如存儲過程、觸發器、函數等,并且需要做主從復制請首選行級模式,次選mixed模式。

9. 二進制日志的模式配置調整

臨時調整命令如下:

mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

永久調整可以將“binlog_format='模式名'”寫入到my.cnf配置文件中,并重啟服務。

10. 行級模式二進制日志實際讀取示例

當在數據庫中執行如下語句:

mysql> SET GLOBAL binlog_format = 'ROW';

或者在my.cnf中加入binlog_format = 'ROW'配置生效后,此時如果更新或者刪除多行數據就會發現binlog日志記錄的內容有所不同,具體命令如下:

[root@oldboy ~]# mysqlbinlog --base64-output=decode-rows -v oldboy-bin.000001
--- --base64-output=decode-rows -v以行級模式解析binlog日志

5. 慢查詢日志

1. 慢查詢日志介紹

慢查詢(slow query log)就是記錄執行時間超出指定值(long_query_time)或其他指定條件(例如,沒有使用到索引,結果集大于1000行)的SQL語句。

2. 慢查詢日志相關參數說明

慢查詢的參數,對于數據庫SQL的優化非常重要,是SQL優化的前提。

慢查詢的參數及說明

3. 慢查詢日志重要參數配置

企業中常見的配置慢查詢的參數為:

slow-query-log = ON    ---慢查詢開啟開關
long_query_time = 2    ---記錄大于2秒的SQL語句
log_queries_not_using_indexes = ON    ---沒有使用到索引的SQL語句
slow-query-log-file = /application/mysql/slow.log    ---記錄慢SQL語句的文件
min_examined_row_limit = 800    ---記錄結果集大于800行的SQL語句

可將上述參數配置到my.cnf里,配置完畢重啟MySQL服務,并進行檢查:

mysql> show variables like 'slow_query%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_query_log      | ON                               |    ---開關已打開
| slow_query_log_file | /application/mysql/logs/slow.log |    ---文件路徑已生效
+---------------------+----------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like '%long_query%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 2.000000 |    ---記錄大于2秒的查詢已生效
+-----------------+----------+
1 row in set (0.00 sec)
mysql> show variables like '%log_queries_not%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON    |    ---記錄沒有使用索引的查詢已生效
+-------------------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like '%min_examined_row_limit%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| min_examined_row_limit | 800   |    ---記錄查詢結果集大于800行的SQL已生效
+------------------------+-------+
1 row in set (0.00 sec)

4. 慢查詢日志的刷新方法

在工作中,可以利用定時任務按天對慢查詢日志進行切割,然后再分析。
示例切割腳本如下:

[root@oldboy scripts]# cat cut_slow_log.sh 
#!/bin/bash
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /application/mysql/logs &&\
mv slow.log slow.log.$(date +%F)&&\
mysqladmin flush-log

將上述腳本放入定時任務,每天0點執行切割任務,配置結果如下:

[root@oldboy scripts]# tail -2 /var/spool/cron/root 
#cut mysql slow log by oldboy at 20190522
00 00 * * * /bin/sh /server/scripts/cut_slow_log.sh > /dev/null 2>&1

5. 使用工具分析慢查詢日志案例

實際工作中,慢查詢的日志可能非常多,給運維人員的優化工作帶來了一定的困難,MySQL官方提供了慢查詢的分析工具mysqldumpslow。
下面介紹一款很不錯的第三方分析工具mysqlsla(需要單獨安裝該工具)。
(1)安裝mysqlsla
下載好mysqlsla-2.03.tar.gz到指定目錄下,然后執行如下命令安裝:

yum install perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
tar xf mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install

(2)利用mysqlsla工具分析慢查詢
mysqlsla命令的默認路徑為:/usr/local/bin/mysqlsla
在實際工作中,通常使用腳本調用mysqlsla工具進行分析,然后每天早晨8點,把分析結果發給企業的核心人員(DBA、運維總監、CTO、研發總監、核心開發),最后由DBA配合核心開發共同優化這些棘手的SQL慢查詢。
簡單的案例腳本如下,注意切割日志和分析合并為一個腳本了:

[root@oldboy mysqlsla]# cat /server/scripts/slow_log_analyze.sh 
#!/bin/bash
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
Date=`date +%F -d -1day`

#cut slow log
cd /application/mysql/logs &&\
mv slow.log slow.log_$Date &&\
mysqladmin flush-log

#analyze slow log
Time=`date +%F`
Path=/usr/local/bin
cd /application/mysql &&\
$Path/mysqlsla -lt slow slow.log_$Date > analyzed_slow_$Date.log 2>&1

#rsync analyzed_slow to backup server    ---省略了此步
#send analyzed slow log to administator on backup server by mail.    ---省略了此步

將上述腳本放入定時任務,每天0點執行切割任務,配置結果如下:

[root@oldboy mysqlsla]# tail -2 /var/spool/cron/root 
#analyzed mysql slow log by oldboy at 20190523
00 00 * * * /bin/sh /server/scripts/slow_log_analyze.sh > /dev/null 2>&1

當然還可以把日志收集到數據庫中或者使用ELK等流行工具收集慢查詢日志,最后分析后可視化展現。

可視化展示圖
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容