最近有几个项目用到了Mysql数据库,遇到了很多的问题。整理几个Tips以后备查。
mysqldump
- 导出Blob数据
默认情况下mysqldump并不会导出blob数据,如果需要导出,那就在命令行使用–hex-blob参数。这个参数非常有用,mysql将blob数据以0xaaa十六进制的字符串导出,导入时会自动解析这些字符串,还原为BLOB数据。
- 提高导出速度
添加–opt参数可以提高导出的效率,这个参数其实是–add-drop-table –add-locks –create-options –disable-keys –extended-insert –lock-tables –quick –set-charset.几个参数的缩写。这里需要介绍的是:1)–quick参数在导出时可以直接跳过缓冲直接将数据写入文件;2)–add-locks会在数据文件中包含对表添加lock的命令,在导入时对表首先进行lock;3)–disable-keys参数会在数据文件中包含禁用constraints的信息,在导入时可以提高导入速度,但在数据导入后,需要手动执行 SET AUTOCOMMIT=1;SET FOREIGN_KEY_CHECKS=1恢复约束和自动提交。
- 数据导入
在导入mysqldump的文本数据时,可以使用msyql命令,并且加上–quick –slient参数,这两个参数很有用。如果要导入第三方数据时,在数据导入前可以禁用约束,如果导入到innodb表中还可以禁用autocommit。
比如:
mysql -uroot -p use mysql; set unique_checks=0; set foreign_key_checks=0; set autocommit=0; ..Import Datafile commit; set unique-checks=1; set foreign_key_checks=1; set autocommit=1;
- 其他参数
–single-transaction 这个参数是专门针对事务设计的,在需要导出的数据前面添加BEGIN SQL 标识符,保证数据的逻辑性和一致性,如果要导出innodb数据可以添加。
–default-character-set 指定mysqldump连接会话的字符集,在数据导出时会进行字符集转换。
–master-data 创建数据复制时可选,如果不使用此参数,可以在数据导入slave后单独通过CHANGE MASTER TO命令配置MASTER服务器。
更多mysqldump信息详见http://dev.mysql.com/doc/refman/5.5/en/mysqldump.html
字符集问题
mysql有多种字符集概念,服务器字符集,数据库字符集,连接字符集,客户端字符集,系统字符集等。
系统字符集表示当前系统环境的字符集;服务器字符集代表当前mysql服务器以及数据字典所使用的字符集;数据库字符集表示创建数据库时数据库默认使用的字符集,mysql允许每个数据库,每张表在创建时指定不同的字符集;客户端字符集以及连接字符集都表示了每个连接mysql数据库的应用或者会话使用的字符集。
可通过show variabales like ‘%char%’;查看当前mysql的字符集:
mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | gbk | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | gbk | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
系统字符集character_set_system是不能修改的;character_set_database\character_set_server可以通过在mysql参数文件中指定character-set-server参数或者在mysqld 启动时指定–default-character-set 参数修改;连接字符集、客户端字符集在连接mysql的应用端通过–default-character-set参数或者登录数据库后通过set names ‘character_name’;的形式进行修改。
字符集的问题很复杂,如果客户端和数据库的字符集不同,为了是应用能够正常使用必须配置正确的客户端字符集。
查看MYSQL客户端连接情况
诊断MYSQL时,可能随时要查看当前MYSQL服务器的连接情况。可以通过两种方式查看服务器的客户端连接:
mysqladmin -uroot -p processlist
[mysql@iQueDB1 ~]$ mysqladmin -uroot -p processlist Enter password: +----+------+-----------+----+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+------+-------+------------------+ | 10 | root | localhost | | Sleep | 353 | | | | 15 | root | localhost | | Query | 0 | | show processlist | +----+------+-----------+----+---------+------+-------+------------------+
或者登录mysql服务器用show processlist命令查看。
日志的维护
mysql有多种类型的日志,最重要有error log\slow log\binglog\innodb logfile; binlog相当于oracle的redolog,记录了数据库的操作,mysql通过binglog完成数据库之间的replication.
error log默认是开启的,可以在参数文件中指定log-error或者启动时用–log-error 修改log的存储路径和文件名;如果不指定这些参数那么mysql会将error log写入hohtname.err文件,并存储在datadir路径下面,同时error log也是innodb monitor信息的默认存储文件;
slow log是数据库性能诊断时用的最多的日志,可以将运行时间大于指定时间的sql语句写入这个文件。默认情况是disabled的,如果要开启这个日志,可以通过下面的参数启用:
slow-query-log=1; 0 或 default is disabed.
slow_query_log_file 指定slow log的存储路径和文件名;
long_query_time=2; 将运行时间大于2s的SQL写入日志; long_query_time between 0 and 10;
binlog非常重要,利用binlog也可以实现类似ORACLE的时间点恢复功能。
log-bin:开启binlog并指定binlog的存储路径及文件名前缀;
log-bin-index:指定binlog的索引文件存储路径及文件名;
binlog_format:指定binlog的存储格式;
max_binlog_size:指定每个binlog文件的最大容量,默认为100M;当binlog文件增长到这个大小时会切换到另外一个文件;
sync_binlog:是否同步binlog到磁盘1:sync;0: cache.如果为0,mysql只会在binlog 缓存满的时候才将日志信息写入磁盘,如果为1,那么mysql将每个写入同步写入磁盘日志文件,这样如果发生数据库crash,mysql会利用binlog回滚失败的事务,在innodb环境,建议将这个参数修改为1;
innodb logfile,是innodb engine的核心文件,innodb engine是一个事务引擎。innodb engine logfile跟踪数据库的事务,实现一致性读取操作,实现类似于oracle redolog和undo的功能。涉及的参数有:
innodb_log_buffer_size:innodb log缓冲的大小;
innodb_log_file_size:innodb日志文件的大小,每个文件都采用循环覆盖的方式,没有归档功能;
innodb_log_files_in_group:每组中日志成员的的个数;默认为2;
innodb_log_group_home_dir:innodb group日志的存储路径;
日志维护方便最重要的还是对binlog的维护;binlog并不会自动清除,一个文件满了会切换到另外一个文件;
通过设置expire_logs_days参数可以方便删除过期的binlog;
如果设置了主从复制,在master端可以通过reset master命令删除已经复制过的日志并重建新的binlog;
通过show master logs\show binary logs;查看当前的binlog:
mysql> show master logs; +---------------+-----------+ | Log_name | File_size | +---------------+-----------+ | binlog.000002 | 126 | | binlog.000003 | 126 | | binlog.000004 | 107 | +---------------+-----------+ 3 rows in set (0.03 sec) mysql> show binary logs; +---------------+-----------+ | Log_name | File_size | +---------------+-----------+ | binlog.000002 | 126 | | binlog.000003 | 126 | | binlog.000004 | 107 | +---------------+-----------+ 3 rows in set (0.00 sec)
最后可以通过purge binary log命令自定义删除日志。
purge binary logs to ‘binglog-000001’;删除指定的日志前的所有日志;
purge binary logs before ‘2012-1-1 00:00:00’;删除2012年之前的日志;
purge binary logs before date_sub(now(),interval 5 day);删除5天前的所有日志;(Oracle中的INTERVAL DAYS必须用INTERVAL ‘4’DAY表示);