Date: 20140102
Auth: Jin
一、mysql 命令行客户端
1)base
-h host
-P port
--socket=path,-S path用于连接的套接字文件替换使用IP PORT连接
-u username
-p password
---database=db_name,-D db_name 连接数据库
--default-character-set=charset client字符集
--execute=statement, -e statement 执行语句
--prompt=name Set the mysql prompt to this value.
--local-infile[={0|1}] 为LOAD DATA INFILE启用或禁用LOCAL功能。
--tee=file_name 记录client操作日志,可以用于path或者大批量部署
2)进入命令行后
mysql> help
在mysql常用
(1)设置字符集
mysql> charset utf8
(2)调用shell命令,类似vim中:shell
system
Usage: \! shell-command
mysql> \! ls
(3)查看状态
mysql> status
(4)开启关闭警告
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
(5)执行文件中的sql source
Usage: \. <filename> | source <filename>
3)设置提示符
--prompt=name
(1)可以用MYSQL_PS1环境变量来设置提示字符串
export MYSQL_PS1="(\u@\h) [\d]> "
(2)mysql配置文件中设置
[client]
prompt=\\u@\\h:[\\d] \\r:\\m:\\s>
显示效果
root@localhost:[test] 08:47:52>
(3)交互式
可以使用prompt(或\R)命令交互地更改提示
prompt (\u@\h) [\d]>
4)mysql技巧
(1) 垂直显示查询结果
mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
(2)使用--safe-updates选项
不允许你执行UPDATE或DELETE语句,除非在WHERE子句中指定一个键值约束或提供一个LIMIT子句(或二者皆使用)。
所有大的SELECT结果自动限制到1,000行,除非语句包括一个LIMIT子句
放弃可能需要检查1,000,000多行组合的多表SELECT语句
二、mysqladmin:用于管理MySQL服务器的客户端
基本连接数据的参数同mysql,
--default-character-set=name是设置数据库的默认字符集
# mysqladmin --help
分类记忆一下
1)操作数据库
mysqladmin create DataBase
创建数据库
mysqladmin drop DataBase
删除数据库
2)显示状态和变量
mysqladmin status
Uptime: 3263 Threads: 1 Questions: 107 Slow queries: 0 Opens: 34 Flush tables: 1 Open tables: 27 Queries per second avg: 0.032
已经运行的秒数:活动线程数目 查询数目 慢查询的数量 打开的数据库表的数量 打开的表的数量 每个语句执行的时间
Flush tables flush refresh和reload命令的数量
Memory in use
mysqld代码直接分配的内存数量。只有用--with--debug=full编译了MySQL该值才显示。
Maximum memory used
mysqld代码直接分配的最大内存数量。只有用--with--debug=full编译了MySQL该值才显示。
简单状态
mysqladmin extended-status
详细状态
mysqladmin variable
详细变量
3)密码管理
mysqladmin password [new-password]
设置新密码
mysqladmin old-password [new-password]
类似password但使用旧的(pre-4.1)密码哈希格式保存 密码
# mysqladmin variables -p163.com |grep password
| old_passwords | OFF
4)线程管理
mysqladmin processlist
查看线程
mysqladmin kill id,id,...
杀掉线程
5)监控服务是否存活
mysqladmin ping
6) 刷新
mysqladmin reload
mysqladmin flush-privileges
刷新权限
flush-hosts Flush all cached hosts
flush-logs Flush all logs #刷新LOG
flush-status Clear status variables
flush-tables Flush all tables
flush-threads Flush the thread cache
7)关闭服务器,启动主从
mysqladmin shutdown Take server down
mysqladmin start-slave Start slave 要作为slave才能运行
mysqladmin stop-slave Stop slave 要作为slave才能运行
三、mysqldump
1)、备份数据操作
(1)、导出所有数据库 --all--database,-A
mysqldump --all-database > 导出的文件名
mysqldump --all-database > /data/backup/db/alldb_bak.sql
(2)、导出单个数据库 --databases, -B
mysqldump 数据库名 > 导出的文件名
mysqldump -u root -p zabbix > /data/backup/db/zabbix_bak.sql
(3)、导出多个数据库 --databases, -B
mysqldump --database 数据库1 数据库2 > 导出的文件名
mysqldump --database zabbix mysql > /data/backup/db/two_db_bak.sql
(4)、压缩备份
直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
注意:在做主从dump数据加上--master-data,也就是--master-data=1
mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,
file和position记录的位置就是slave从master端复制文件的起始位置。SLAVE只需要start slave即可
man里有介绍
2)导出一个数据库结构 --no-data, -d
(1)、基本操作
mysqldump -–no-data -–databases databasename1 databasename2 > structurebackupfile.sql
(2)增加创建数据库结构前的删除操作
--add-drop-database 在每个CREATE DATABASE语句前添加DROP DATABASE语句。貌似没有
--add-drop-table 在每个CREATE TABLE语句前添加DROP TABLE语句。 默认。反选项--skip-add-drop-table
--add-drop-trigger
mysqldump -u root -p -d --add-drop-table zabbix > /data/backup/db/zabbix_sche.sql
3)、不锁表备份
Mysqldump备份要锁表,不锁表备份的办法
加上--lock-tables=false参数,如果是innodb,则加上--single-transcation
4)、默认选项和反选项
默认选项 --opt
Use of --opt is the same as specifying --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert,
--lock-tables, --quick, and --set-charset. All of the options that --opt stands for also are on by default because --opt is on by
default
--compact 选项
Use of --compact is the same as specifying --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, and
--skip-set-charset options.
产生少量输出。该选项禁用注释并启用--skip-add-drop-tables、--no-set-names、--skip-disable-keys和--skip-add-locking选项
--opt反选项 --skip-opt
To reverse --opt for all features except index disabling and table locking, use --skip-opt --disable-keys --lock-tables.
--tables
覆盖---database或-B选项。选项后面的所有参量被看作表名。
5) -R 导出存储过程
四、mysqlimport
load data infile的封装
将特定格式的文本数据导入指定的MYSQL,比如标准的CSV文件。
从来没用过,outfile和load data infile到用过。
没有分割符
mysql> select * from users into outfile '/tmp/zabbix_users_bak.txt';
mysql> load data infile '/tmp/zabbix_users_bak.txt' into table users;
有分割符
mysql> select * from users into outfile '/tmp/zabbix_users_bak1.txt' FIELDS TERMINATED BY ',';
mysql> load data infile '/tmp/zabbix_users_bak1.txt' into table users FIELDS TERMINATED BY ',';
五、mysqlcheck
1、基本描述
mysqlcheck的功能类似myisamchk,但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck,
而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。使用myisamchk修复失败是不可逆的。
Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。
它确定在要执行的操作中使用使用哪个语句,然后将语句发送到要执行的服务器上。
并不是所有存储引擎都支持CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABL,比如innoDB不支持REPAIR.
CHECK TABLE、检查
REPAIR TABLE、修复
ANALYZE TABLE、分析
OPTIMIZE TABL 优化
有3种方式来调用mysqlcheck:
shell> mysqlcheck[options] db_name [tables]
shell> mysqlcheck[options] ---database DB1 [DB2 DB3...]
shell> mysqlcheck[options] --all--database
如果没有指定任何表或使用---database或--all--database选项,则检查整个数据库。
下面的名可用来更改mysqlcheck的默认行为:
mysqlrepair
默认选项为--repair
mysqlanalyze
默认选项为--analyze
mysqloptimize
默认选项为--optimize
-B, --databases
2、自己实践
1) 检查表
-c, --check Check table for errors.
-C, --check-only-changed
Check only tables that have changed since last check or
haven't been closed properly.
[root@mnt ~]# mysqlcheck -c --database mysql
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log
Error : You can't use locks with log tables.
status : OK
mysql.help_category OK
[root@mnt ~]# mysqlcheck -C --database mysql
mysql.columns_priv Table is already up to date
mysql.db Table is already up to date
mysql.event Table is already up to date
mysql.func Table is already up to date
mysql.general_log
Error : You can't use locks with log tables.
status : OK
mysql.help_category Table is already up to date
2)分析表
-a, --analyze Analyze given tables.
[root@mnt ~]# mysqlcheck -a -B mysql
mysql.columns_priv Table is already up to date
mysql.db Table is already up to date
mysql.event Table is already up to date
mysql.func Table is already up to date
mysql.general_log
note : The storage engine for the table doesn't support analyze
3)优化
-o, --optimize Optimize table.
[root@mnt ~]# mysqlcheck -o -B mysql
mysql.columns_priv Table is already up to date
mysql.db Table is already up to date
mysql.event Table is already up to date
mysql.func Table is already up to date
mysql.general_log
note : The storage engine for the table doesn't support optimize
4)修复表
[root@mnt ~]# mysqlcheck -r -B mysql
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.servers OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
六、 mysqldumpslow
主要功能
1、打开slowlog
long_query_time = 2
slow-query-log-file = /data/logs/mysql/3306_slow.log
log-queries-not-using-indexes #log没有使用索引的query。
2、分析slowlog
# mysqldumpslow --help
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default 是表示按照何种方式排序, 默认at
al: average lock time 平均锁定时间
ar: average rows sent 平均返回记录数
at: average query time 平均执行时间
c: count c 记录次数
l: lock time 锁时间
r: rows sent 返回的记录数来排序,
t: query time 时间
-r reverse the sort order (largest last instead of first) 倒序从最后开始显示
-t NUM just show the top n queries #显示头n条记录
-a don't abstract all numbers to N and strings to 'S'
-n NUM abstract numbers with at least n digits within names
-g PATTERN grep: only consider stmts that include this string #后边可以写一个正则匹配模式,大小写不敏感的。
-h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
default is '*', i.e. match all
-i NAME name of server instance (if using mysql.server startup script)
-l don't subtract lock time from total time
实例
/path/mysqldumpslow -s r -t 10 /database/mysql/slow-log
得到返回记录集最多的10个查询。
/path/mysqldumpslow -s t -t 10 -g “left join” /database/mysql/slow-log
得到按照时间排序的前10条里面含有左连接的查询语句。
记忆部分
-s, 是表示按照何种方式排序,
c 记录次数
t 查询时间
l 锁时间
r 返回的记录数来排序,
at 平均执行时间
al 平均锁定时间
默认 at
-t, 是top n的意思,即为返回前面多少条的数据;
mysqldumpslow -s at -t 10 /database/mysql/slow-log
七、mysqlbinglog
主要功能分析MySQL Server所产生的二进制日志。当希望通过备份的binlog做一些指定时间之类的恢复时,mysqlbinlog可以帮助我们找出恢复操作要做哪些事情。
1、打开binlog
log-bin=mysql-bin
log-bin = binlogs/mysql-bin 文件存放目录前缀
binlog_format = ROW #格式
#binlog_format=mixed
expire_logs_day=1 #过期时间 超过手动清除
max_binlog_size=700M #每个文件大小
log-bin-index[=file_name] #二进制日志索引文件的文件名。当mysqld在运行时,不应手动编辑该文件
binlog_cache_size=3M
对非事务表的更新执行完毕后立即保存到二进制日志中。对于事务表,例如BDB或InnoDB表,所有更改表的更新(UPDATE、DELETE或INSERT) 被缓存起来,直到服务器接收到COMMIT语句。
2、分析binlog
[root@mnt mysql]# mysqlbinlog mysql-bin.000003
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#140101 17:40:02 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.71-log created 140101 17:40:02 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
cuLDUg8BAAAAZgAAAGoAAAABAAQANS4xLjcxLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABy4sNSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
'/*!*/;
# at 106
#140101 17:43:02 server id 1 end_log_pos 193 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1388569382/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database dbtest
/*!*/;
# at 193
#140101 17:44:39 server id 1 end_log_pos 356 Query thread_id=3 exec_time=0 error_code=0
use `dbtest`/*!*/;
SET TIMESTAMP=1388569479/*!*/;
create table tab1( id int(11) not null auto_increment, name varchar(25) not null,primary key(id) )
/*!*/;
# at 356
#140101 17:51:02 server id 1 end_log_pos 426 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1388569862/*!*/;
BEGIN
/*!*/;
# at 426
#140101 17:51:02 server id 1 end_log_pos 454 Intvar
SET INSERT_ID=1/*!*/;
# at 454
#140101 17:51:02 server id 1 end_log_pos 567 Query thread_id=6 exec_time=0 error_code=0
SET TIMESTAMP=1388569862/*!*/;
insert into tab1(name) values ('diege'),('lily')
/*!*/;
# at 567
#140101 17:51:02 server id 1 end_log_pos 594 Xid = 81
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
我做的创建表,插入数据操作都记录进去了。
不是直接可读的SQL语句时
BINLOG '
HxWdVBMlgQAASwAAAAIBAAAAADAAAAAAAAEABGdhbWUADnRiX21zZ19oaXN0b3J5AA4IAQwCCAgP
DwEBDwEPDAiWAFgC3AXcBdg8
HxWdVBclgQAApAAAAKYBAAAAADAAAAAAAAEADv//CNBtBgAAAAAAAAW6GpJ+URIAAAEAAAAAAAAA
qQ8AAAAAAAAM55m75b2V5aWW5YqxKADntK/orqHnmbvlvZUz5aSp77yM6I635b6X55u45bqU5aWW
5Yqx44CCAQAfAFt7J2l0ZW1JZCc6MzEsJ2l0ZW1BbW91bnQnOjUwfV0B+VyhflESAAA=
# mysqlbinlog --base64-output=decode-rows -v mysql-bin.000011
3、通过binlog恢复数据
在备份恢复专题会详细做这方面的测试