mysql监控与优化

  • 内容
  • 评论
  • 相关

很多同学在使用musqld服务器的时候会遇到很多的错误,因此需要经常的优化和排查,那么我们在这篇文章将会不定期的将一些优化参数和排错技巧更新上来:

#2006 - MySQL server has gone away

这个错误,字面意思是mysql的连接丢失了,那么这里我们不讨论应用程序的问题,在此只关注mysqld的服务器,我们可以这样来调节:

vim /etc/my.cnf
wait_timeout=2880000
interactive_timeout = 2880000
max_allowed_packet = 10M

简单解释一下这两个参数,wait_timeout这个大家很熟悉,这个是服务器关闭活动连接前的等待描述,当然这个是非interactive的也就是非交互的连接。再来说这个interactive_timeout,也是等待时间,参考前一个参数我们知道这也是关闭活动连接钱等待的秒数,可以理解为服务器忍受的响应时间,这个是交互的。交互式客户端为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
当然这时候优化一下数据表也是一个好办法

mysqlcheck -a -c -o -r --all-databases -uroot -p
#修复整个数据库
mysqlcheck -a -c -o -r dbname -uroot -p
#修复一张表
mysqlcheck -r dbname tbname -uroot -ppasswd
#修复多张表
mysqlcheck -r dbname tbname1 tbname2 -uroot -ppasswd

有一点需要注意,这些参数最好不要同时使用,每次使用一个,否则会按照默认执行第一个参数,或者报错:

mysqlcheck doesn't support multiple contradicting commands

这个工具属于“冷修复”,不会对运行着的数据库造成影响。
当然经常备份是个好习惯,给出备份的命令:
只导出数据不导出结构:

mysqldump -t -uroot  -ppwd dbname tbname  > /path/dump.sql

只导出结构不导出数据

Mysqldump  --opt -d -uroot  -ppwd dbname tbname > /path/dump.sql

在使用source导入的时候,有时候会报出一些问题,例如

error Variable 'time_zone' cant't set to null
error variable 'sql_mode'……

这个时侯我们可以查看一下导出的sql文件,会有这样一些注释:

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

这些注释是导出sql的时候存在的,记得在导入数据的时候去掉。不然会报错。当然在建立数据库的时候也需要和导入文件的编码一致,例如建立utf8的数据库:

 create database mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

当然,如果是服务器在国外,可以查看一下网路的路由节点状况是不是有问题。
除了使用source导入sql文件之外,我们还可以使用如下命令:

mysql -uuname -ppasswd dbname < D:/path/to/db.sql;

很多同学在win环境下使用mysql的command导入的时候有时候使用source导入会出错或者乱码可以换用这个,另,在win下的路径格式是D:\path\to\db.sql,在很多时候你可以使用linux的路径格式D:/path/to/db.sql,例如此刻导入sql便可以,在程序配置中的文件路径也可以这样写。还有如果是win下运行mysql命令,语句后面的";"最好不好加。
另外如果导入sql乱码还需要核对数据库的编码,例如你的sql如果是utf8那么可以显示的在导入之时设置好编码:

mysql -uroot -ppassword < import.sql --default-character-set=utf8

那么其实呢,大部分时间我们根本不需要显示的设置编码的,因为你导出数据库的sql文件的时候,会自动导出数据库的表编码格式,会有如下的代码:

-- ----------------------------
-- Table structure for `ibjrc_ad_brand`
-- ----------------------------
DROP TABLE IF EXISTS `brand`;
CREATE TABLE `brand` (
  `brandid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `orderid` smallint(4) unsigned NOT NULL DEFAULT '0',
  `siteid` smallint(4) NOT NULL DEFAULT '0',
  `beginedate` int(8) NOT NULL DEFAULT '0',
  `finishdate` int(8) NOT NULL DEFAULT '0',
  KEY `brandid` (`brandid`),
  KEY `siteid` (`siteid`,`status`,`orderid`,`beginedate`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

但是你在插入数据库的时候最好设置好编码:

mysql_query("set names '编码')

否则插入数据库是乱码那就麻烦了。
#本地连接到taobao服务器所经过的节点:

traceroute taobao.com
 1  router1-dal.linode.com (67.18.7.161)  6.388 ms  6.335 ms  6.308 ms
 2  xe-2-0-0.car03.dllstx2.networklayer.com (67.18.7.89)  0.259 ms  0.253 ms  0.228 ms
 3  po101.dsr01.dllstx2.networklayer.com (70.87.254.73)  0.469 ms  0.489 ms  0.520 ms
 4  po21.dsr01.dllstx3.networklayer.com (70.87.255.65)  0.734 ms  0.823 ms  5.914 ms
 5  ae16.bbr02.eq01.dal03.networklayer.com (173.192.18.228)  0.524 ms  0.524 ms  0.497 ms
 6  ae-11.r01.dllstx04.us.bb.gin.ntt.net (157.238.224.229)  5.791 ms  5.762 ms  5.733 ms
 7  ae-1.r20.dllstx09.us.bb.gin.ntt.net (129.250.2.10)  5.656 ms ae-1.r21.dllstx09.us.bb.gin.ntt.net (129.250.2.198)  5.617 ms  5.568 ms
 8  ae-5.r20.lsanca03.us.bb.gin.ntt.net (129.250.2.168)  66.774 ms  37.863 ms  37.743 ms
 9  ae-1.r04.lsanca03.us.bb.gin.ntt.net (129.250.5.2)  41.389 ms  35.804 ms ae-2.r06.snjsca04.us.bb.gin.ntt.net (129.250.5.55)  43.979 ms
10  218.30.54.217 (218.30.54.217)  31.437 ms  35.843 ms  40.208 ms
11  202.97.50.41 (202.97.50.41)  33.557 ms 202.97.52.213 (202.97.52.213)  41.876 ms  41.857 ms
12  202.97.50.89 (202.97.50.89)  178.737 ms  182.269 ms  178.671 ms
13   (202.97.33.129)  185.697 ms  178.557 ms  185.605 ms

ping是测试两台主机之间的通信测试,而traceroute是两台主机之间的节点的连通状况。
traceroute各个参数如下:
-n :可以不必進行主機的名稱解析,單純用 IP ,速度較快!
-U :使用 UDP 的 port 33434 來進行偵測,這是預設的偵測協定;
-I :使用 ICMP 的方式來進行偵測;
-T :使用 TCP 來進行偵測,一般使用 port 80 測試
-w :若對方主機在幾秒鐘內沒有回聲就宣告不治...預設是 5 秒
-p 埠號:若不想使用 UDP 與 TCP 的預設埠號來偵測,可在此改變埠號。
-i 裝置:用在比較複雜的環境,如果你的網路介面很多很複雜時,才會用到這個參數;
舉例來說,你有兩條 ADSL 可以連接到外部,那你的主機會有兩個 ppp,
你可以使用 -i 來選擇是 ppp0 還是 ppp1 啦!
-g 路由:與 -i 的參數相仿,只是 -g 後面接的是 gateway 的 IP 就是了。

traceroute -w 1 -n -T gaoxueping.com

這個 traceroute 挺有意思的,這個指令會針對欲連接的目的地之所有 node 進行 UDP 的逾時等待, 例如上面的例子當中,由鳥哥的主機連接到 Yahoo 時,他會經過 12 個節點以上,traceroute 會主動的對這 12 個節點做 UDP 的回聲等待,並偵測回覆的時間,每節點偵測三次,最終回傳像上頭顯示的結果。 你可以發現每個節點其實回覆的時間大約在 50 ms 以內,算是還可以的 Internet 環境了。

比較特殊的算是第 10/12 個,會回傳星號的,代表該 node 可能設有某些防護措施,讓我們發送的封包資訊被丟棄所致。 因為我們是直接透過路由器轉遞封包,並沒有進入路由器去取得路由器的使用資源,所以某些路由器僅支援封包轉遞, 並不會接受來自用戶端的各項偵測啦!此時就會出現上述的問題。因為 traceroute 預設使用 UDP 封包,如果你想嘗試使用其他封包, 那麼 -I 或 -T 可以試看看囉!

由於目前 UDP/ICMP 的攻擊層出不窮,因此很多路由器可能就此取消這兩個封包的回應功能。所以我們可以使用 TCP 來偵測呦! 例如使用同樣的方法,透過等待時間 1 秒,以及 TCP 80 埠口的情況下,可以這樣做:

mysqld服务端的参数情况简介如下
首先根据以下的参数和配置查看和分析mysql的运行状况,并作出配置,以下各项分别针对每一项影响mysql数据表特别是myisam的参数进行分析和优化配置,其中不排除动态参数随时改变,因此后续参数值会根据数据库运行情况适时改变。

查看mysql服务器的配置信息

show variables;

查看服务器运行的各种状态

show global status;[/shll]

慢查询的查看:
可以查看是否开启慢查询log,以及慢查询的时间定义。
show variables like '%slow%';

可以查看Slow_queries,如果值偏大,说明某些线程在延迟查询。

show global status like '%slow%'

最大连接数的查看:
增加该值能增加mysqld要求的文件描述符的数量
在安装时候默认是100,在my.cnf中或者my.ini中 ,mysql支持的最大连接数16384。

show variables like 'max_connections'

相应连接数的查看,这是过去达到的最大连接数,

show global status like 'max_used_connections'

响应连接数/最大连接数 ≈ %85 最理想
注:很多用户为了避免连接数过大设置为32000。添加了最大允许连接数,对系统消耗增加不大。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
默认为100,本设置会增大mysql要求的文件描述符的数量。

Back_log的查看
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。如果期望在一个短时间内有很多连接,你需要增加它。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过back_log,将不被授予连接资源。安装的时候默认是50。
另外,这值(back_log)限于计算机操作系统对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制(可以检查你的 OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。
可以根据max_connections来适当设置Back_log,如果max_connections增加的很快,或者数据很大的视乎,可以适当的增加Back_log;
默认为50。

进程使用情况

mysql> show status like "threads_connected";
mysql> show  status like "threads%";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

Threads_connected为当前连接的线程数,这个数目可以和max_connections作比较,如果超过max_connections则会报。这个数据是动态的。可以用来检测适时的连接。

如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明 MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,还可以和max_connections比较,适当改变其值,查询服务器 thread_cache_size配置:

mysql> show variables like "thread_cache_size";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 8     |
+-------------------+-------+
1 row in set (0.00 sec)

默认为8。

查看key_buffer_size,
这个参数对于myisma来说是最重要的参数之一。也就是索引缓存。

show variables like 'key_buffer_size';

指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般默认配置文件我们设为16M,实际上稍微大一点的站点这个数字是远远不够的,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。如果此比例在0.01%以下的话,key_buffer_size分配的过多,可以适当减少。1:20000性能较为不错。
对于内存在4GB左右的服务器该参数可设置为256M或384M
对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M),也就是安装时候的默认值。

show global status like 'key_read%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| Key_read_requests | 14746431 |
| Key_reads         | 2331     |
+-------------------+----------+

Key_read_requests:从缓存读取索引的请求次数
Key_reads:从磁盘读取索引的请求次数
表示有14746431个索引请求,有2331个请求未找到索引直接从硬盘读取。
索引未命中率为0.0158072%
默认为16M。

查询缓存

mysql> show status like "qcache%";
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16768400 |
| Qcache_hits             | 0        |
| Qcache_inserts          | 0        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 434      |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。因此也提醒我们在sql语句中尽量少用函数表达式,这还会影响到索引的使用(在可以避免的情况下)。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。

查询缓存只会存储select操作,不会存储update,delete,insert和存储过程等。在select语句之前不要存在空格或者注释。当查找缓存时第一个字母不是S,那么就停止查询缓存结果了。

我们可以查看关于查询缓存的配置

mysql> show variables like "query_cache%";
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

query_cache_limit:表示超过1M的查询将不会被缓存。
query_cache_size:表示分配给查询缓存的RAM空间为16M。
query_cache_type表示查询缓存已经启用。
query_cache_min_res_unit:表示缓存块的最小大小为4KB。
query_cache_min_res_unit的配置需要适当,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。

查询缓存适用于长时间检测数据表,可以用参数Qcache_free_blocks检测数据碎片并及时的清理。并且根据空闲的内存Qcache_free_memory和分配给查询缓存的空间对比适当提高或者减少query_cache_size
目前query_cache_size配置为默认的16M。

sort_buffer_size的查看
每个需要进行排序的线程分配该大小的一个缓冲区。增加此值加速ORDER BY或GROUP BY操作。
修改这个值可以在mysql的配置文件my.cnf中

[mysqld]
port		= 3306
socket		= /tmp/mysql.sock
skip-locking
#back_log = 50
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 128
tmp_table_size = 64M
sort_buffer_size = 2M

之后重启mysql之后,便可以看到设置的值。

mysql> show variables like "sort%";
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| sort_buffer_size | 1048576 |
+------------------+---------+
1 row in set (0.00 sec)

Table cache的查看
增加该值能增加mysqld要求的文件描述符的数量
查看打开的表和打开过的表
Open_tables 表示打开表的数量,Opened_tables代表自从MySQL启动后,打开表的数量。如果Opened_tables数量过大,说明配置中 table_open_cache或者table_cache值可能太小。
所有线程打开的表的数目,增大该值可以增加mysqld需要的文件描述符的数量。
(1)对于myisam存储引擎,打开1张表需要2个文件描述符(一个.MYD文件,一个.MYI文件)。
(2)对于innodb存储引擎,开启表的独立表空间(innodb_file_per_table)打开1张表只需要1个文件描述符(一个.ibd文件)。
每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值’Open_tables’和’Opened_tables’,可以决定是否需要增加 table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用’Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

mysql> show global status like "open%tables%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 64    |
| Opened_tables | 1261  |
+---------------+-------+
2 rows in set (0.00 sec)

我们可以查询服务器的cache的配置:

mysql> show global variables like "table_open_cache";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 64    |
+------------------+-------+
1 row in set (0.00 sec)

Open_tables / Opened_tables * 100% =69% 理想值 (>= 85%)
Open_tables / table_cache * 100% = 100% 理想值 (<= 95%)

默认为64,目前table_open_cache或者table_cache设置为128。后续可根据open_tables或者 openen_tables的大小调整。本设置会增大mysql要求的文件描述符的数量。后续可以根据open_tables的数量作调整。

文件打开数(open_files)

mysql> show global status like 'open_files';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 128   |
+---------------+-------+
1 row in set (0.00 sec)

Open_files表示打开的文件数。


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

open_files_limit表示打开文件限制。
比较合适的设置:Open_files / open_files_limit * 100% <= 75% tmp_table_size的查看 这个变量决定了内存中临时表的大小,每个线程都有一个。如果表变得特别大,myisam表就会被建在磁盘上。 优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。 查看带临时表的查询语句的执行过程,这样你就可以得到需要改进的临时表。需要注意的是临时表的内 存大小是为每个线程都分配的。 如果你有复杂的查询语句,sort_buffer_size和tmp_table_size就可能非常有用。 如果临时myisam表,小于或等于 tmp_table_size的时候,MySQL就会把它保存在内存中,否则,就会把这 些数据写到磁盘上,需要的时候重新读取。如果需要的空间超过了tmp_table_size的大小,MySQL就会在 tmpdir目录下创建基于磁盘的表。 怎样决定tmp_table_size 的大小: 对比Created_tmp_tables和Created_tmp_disk_tables计数器。如果 Created_tmp_tables不比Created_tmp_disk_tables 大的多的话,你就需要增加 Created_tmp_tables的值。大致目标是: Created_tmp_disk_tables是 Created_tmp_tables的2%[shell] mysql> show variables like "tmp%";[/shell][shell] +----------------+----------+ | Variable_name | Value | +----------------+----------+ | tmp_table_size | 16777216 | | tmpdir | /tmp | +----------------+----------+[/shell] 默认大小为16M。[shell] read_buffer_size[/shell] 是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。 默认为131072(0.1M)。[shell] read_rnd_buffer_size[/shell] 是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。 默认为262144(0.2M)[shell] interactive_timeout:[/shell] 服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800。 interactive_timeout 需在mysql_connect()设置CLIENT_INTERACTIVE选项后起作用,并被赋值为wait_timeout; Join操作使用内存(join_buffer_size):应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index join),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作(具体 Join 实现算法请参考:MySQL 中的 Join 基本实现原理)。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。[shell] wait_timeout [/shell] 服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800。 wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题,举个例子,把wait_timeout设置为10,某些情况下可能会出问题,比如说有一个CRON脚本,其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下,以便SERVER知道你还活着,重新compute一下wait_timeout时间): 该系统变量仅当客户端连接服务器时设置了“MYSQL_CLIENT_INTERACTIVE”标志才生效,例如: /启用MYSQL_CLIENT_INTERACTIVE模式,连接数据库服务器[shell] $link = mysql_connect($host, $user, $pwd, false, MYSQL_CLIENT_INTERACTIVE);[/shell] 可以在my.cnf中设置[shell] [mysqld] wait_timeout=28800 interactive_timeout=28800[/shell] 默认为28800。 SUM 文件最终配置,内存为4G[shell] [mysqld] back_log = 64 50 key_buffer = 256M 16M table_cache = 128 64 tmp_table_size = 64M 16M sort_buffer_size = 32M 2M read_buffer_size = 1M 131072 read_rnd_buffer_size = 2M 262144 thread_cache_size = 10 8 query_cache_size= 16M 16M max_connections = 500 100 wait_timeout= 120 28800[/shell] mysql的数据文件默认存放在/var/lib/mysql/databasename下面。

评论

0条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注