最後更新: 2018-05-18
目錄
- Check Version
- Mysql slow to connect | root@localhost login 失敗
- max_connect_errors
- max_allowed_packet
- Aborted_clients & Aborted_connects
- Find duplicate records in MySQL
- Performance
- tmp DB
- LOG
- Ignoring the lost+found Directory in your Datadir
- MySQL - Too many ... (max_connections)
- Mysql Script
- remove tail zero
- Never want your MySQL to cause the operating system to swap
- MySQL with huge page
- sleep
- Check tables size in DB
- Queries vs Questions
- Shrink ibdata1 file
- Upgrade
Check Version
#A - version()
select version();
+-----------+ | version() | +-----------+ | 4.1.22 | +-----------+
OR
#B - Server System Variables
SHOW VARIABLES LIKE "%version%";
+-------------------------+-------------------------------------------------------------+ | Variable_name | Value | +-------------------------+-------------------------------------------------------------+ | protocol_version | 10 | | version | 4.1.22 | | version_bdb | Sleepycat Software: Berkeley DB 4.1.24: (November 3, 2006) | | version_comment | Source distribution | | version_compile_machine | i686 | | version_compile_os | redhat-linux-gnu | +-------------------------+-------------------------------------------------------------+
Mysql slow to connect | root@localhost login 失敗
Mysql slow to connect | root@localhost login 失敗
skip-name-resolve <-- disable DNS host name lookups
# HOST_CACHE_SIZE define (default value: 128) <-- --skip-host-cache
FLUSH HOSTS statement
後果:
root@localhost 會 login 唔到
因為 privileges table 上的 hostnames 會無效左 (root@localhost)
Checking
mysql> SELECT user, host FROM mysql.user;
max_connect_errors
Host '*' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
Block until you flush-hosts / restart service
Default
# Ver < MySQL 5.6.6 => 10
# Ver > MySQL 5.6.6 => 100
Setting
max_connect_errors=10
* first verify that there is nothing wrong with TCP/IP connections
max_allowed_packet
The packet message buffer is initialized to net_buffer_length bytes,
but can grow up to max_allowed_packet bytes when needed.
It should be as big as the largest BLOB you want to use.
The maximum size of a BLOB or TEXT object is determined by its type,
but the largest value you actually can transmit between the client and server is determined by
the amount of available memory and the size of thecommunications buffers.
Error:
MySQL Error: 1153 (Got a packet bigger than 'max_allowed_packet' bytes) Session halted.
查看:
# unit: byte
SHOW VARIABLES like "max_allowed_packet";
Output
+--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 8387584 | +--------------------+---------+
/etc/my.cnf
max_allowed_packet = 1M // default
Aborted_clients & Aborted_connects
log_warnings=1
... 717781 [Note] Aborted connection 717781 to db: 'MyDB' user: 'MyDB' host: 'localhost' (Got an error reading communication packets) ... 715754 [Note] Aborted connection 715754 to db: 'MyDB' user: 'MyDB' host: 'localhost' (Got an error writing communication packets)
A communication error occurs it increments the status counter for either "Aborted_clients" or "Aborted_connects"
Aborted_clients
The number of connections that were aborted because the client died without closing the connection properly.
The client slept for longer than the defined "wait_timeout" or "interactive_timeout" seconds
(the connection gets forcibly closed by the MySQL server)
The client terminated abnormally or exceeded the max_allowed_packet for queries
wait_timeout=28800 # Default
The number of seconds the server waits for activity on a noninteractive connection before closing it.
interactive_timeout=28800 # Default
The number of seconds the server waits for activity on an interactive connection before closing it.
An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect().
connect_timeout=10
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.
Aborted_connects
The number of failed attempts to connect to the MySQL server.
For additional connection-related information, check the Connection_errors_xxx status variables and the host_cache table.
Notes
PHP does not disconnect from the server after every request served,
but keeps the connections for future requests.
When not used, these connections are in a "sleep" state, as can be seen with "mysqladmin processlist".
Usually, the mysql server will kill such processes if their "idle time" exceeds the value of wait_timeout.
(The "Time" value in the processlist = idle time)
/etc/my.cnf:
[mysqld] ... # Default: 28800 wait_timeout=180
systemctl restart mariadb
Checking
show variables like 'wait_timeout'
Find duplicate records in MySQL
SELECT COUNT(*), column1, column2 FROM tablename GROUP BY column1, column2 HAVING COUNT(*)>1;
i.e.
SELECT COUNT(*), domain FROM control_transports GROUP BY domain HAVING COUNT(*)>1;
Performance
Disable DNS host name lookups by starting mysqld with the
--skip-name-resolve
HOST_CACHE_SIZE (default value: 128)
key_buffer_size / table_cache
buffer
All threads share the MyISAM key buffer;
its size is determined by the key_buffer_size variable.
check:
shell> mysqladmin variables
shell> mysqladmin extended-status
table_cache
The number of open tables for all threads.
Increasing this value increases the number of file descriptors that mysqld requires.
當 Server Status Variables 看到 Opened_tables 過大時就要增加 table_cache 了
key_buffer_size
Index blocks for MyISAM and ISAM tables are buffered and are shared by all threads.
table_cache = 1600 key_buffer_size = 1500M
tmp DB
# Show Setting
show global status like 'Created_tmp%';
+-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 54 | | Created_tmp_files | 6 | | Created_tmp_tables | 212 | +-------------------------+-------+
# Setting
tmp_table_size = 256M
max_tmp_tables = 32
LOG
# query logging
log=/var/log/mysql.log
# error logging
log-error=/var/log/mysql.err
# Flush all logs
mysqladmin flush-logs
# log-slow-queries
# more than 3 seconds
long_query_time=3
# slow.log in the MySQL data directory.
log-slow-queries=log-slow-queries.log
Ignoring the lost+found Directory in your Datadir
--ignore-db-dir # ignore the given directory name for purposes of the SHOW DATABASES statement or INFORMATION_SCHEMA tables
# 查看 DB 是否支持 "--ignore-db-dir"
# MySQL verion > 5.6.3 才用到
# MariaDB version > 5.5.28
mysql --version
AND
show global variables like 'ignore_db_dirs';
Setting
[mysqld] # omit multiple directories ignore-db-dir=lost+found ignore-db-dir=_backup
Mysql Script
mysql -u root -pPASSWORD DB_NAME -e "select loginid,password from user where active='Y'" > /tmp/user.tmp
Remove tail zero
i.e.
SELECT email, quota/1024/1024 as 'Quota(MB)' FROM `mail_user` WHERE 1
user@domain 300.00000000
解決
SELECT ROUND(2/50)
or
SELECT CEILING(2/50)
Never want your MySQL to cause the operating system to swap
[1] Whole system
# echo "vm.swappiness=1" >> /etc/sysctl.conf
# Checking: sysctl vm.swappiness
echo 1 > /proc/sys/vm/swappiness
[2] MySQL Only
* works on systems that support the mlockall() system call
* need to run mysql as “root” user
my.cnf
[mysqld] memlock
MySQL with huge page
優點
-
* In MySQL, large pages can be used by InnoDB (innodb_buffer_pool_size)
(MyISAM storage engine uses normal memory allocation.) - * reduces the overhead of Translation Lookaside Buffer (TLB) lookups
- * Lock memory to reduce the performance degradation caused by memory release and consumption
# To check whether supports
grep -i huge /proc/meminfo
/etc/sysctl.conf
# Set the number of pages to be used. # Each page is normally 2MB vm.nr_hugepages = N1 # Set the group number that is permitted to access this memory # Get: id mysql vm.hugetlb_shm_group= gid # Increase the amount of shmem permitted per segment () kernel.shmmax = N2 # Increase total amount of shared memory (number of pages(4KB)) kernel.shmall = N3
N1: Calculate MySQL Maximum Memory Usage(vm.nr_hugepages)
- show variables like 'query_cache_size';
- show variables like 'table_open_cache';
- show variables like 'innodb_buffer_pool_size';
- show variables like 'innodb_log_file_size';
/etc/security/limits.conf
mysql hard memlock unlimited mysql soft memlock unlimited
my.cnf
[mysqld] large-pages
Sleep
# This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0
- mysql_pconnect (persistent connections)
- miss mysql_close
/etc/my.cnf
[mysqld] # Default: 28800 (8 hrs) wait_timeout=180
ERROR 2013
Msg
ERROR 2013 (HY000) at line 3447: Lost connection to MySQL server during query
Fix
connect_timeout = 10 max_allowed_packet = 10M wait_timeout = 3600 interactive_timeout = 3600
Check tables size in DB
SELECT TABLE_NAME AS `Table`, ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)` FROM information_schema.TABLES WHERE TABLE_SCHEMA = "DB_NAME" ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
Queries vs Questions
Queries
This variable includes statements executed within stored programs
Questions
This includes only statements sent to the server by clients and
no longer includes statements executed within stored programs, unlike the Queries variable.
Shrink ibdata1 file
ls -h /var/lib/mysql/ib*
-rw-rw---- 1 mysql mysql 4.8G Aug 16 23:00 /var/lib/mysql/ibdata1
...
mysql -e 'show databases' # 如果有其他 DB, 那再 dump 出來
mysqldump -R DBNAME > DBNAME.sql
mysql -e 'DROP DATABASE DBNAME' # 建議 backup 好再 DROP
service mysqld stop
rm /var/lib/mysql/ibdata1
rm /var/lib/mysql/ib_logfile*
service mysqld start
mysql -e 'CREATE DATABASE DBNAME CHARACTER SET utf8'
mysql DBNAME < DBNAME.sql
Upgrade
# MySQL 5.1 -> 5.7
sed -i 's/ROW_FORMAT=FIXED//g' db.sql