zoukankan      html  css  js  c++  java
  • Mysql 常用工具

    mysqladmin:用于管理MySQL服务器的客户端  

    mysqladmin是一个执行管理操作的客户程序。可以用它来检查服务器的配置和当 前的状态,创建并删除数据库等等。

    这样调用mysqladmin

    shell> mysqladmin [optionscommand [command-options] [command[command-options]] ...

    mysqladmin支持下面的命令:

    • create db_name
      创建一个名为db_name的 新数据库。
    • debug
      告诉服务器向错误日志写入调试信息。
    • drop db_name
      删除名为db_nam的 数据库和所有表。
    • extended-status
      显示服务器状态变量及其值。
    •  flush-hosts
      刷新主机缓存中的所有信息。
    • flush-logs
      刷新所有日志。
    • flush-privileges
      重载授权表(类似reload)。
    • flush-status
      清除状态变量。
    •  flush-tables
      刷新所有表。
    • flush-threads
      刷新线程缓存。
    •  kill id,id,...
      杀掉服务器线程。
    • old-password new-password
      类似password但 使用旧的(pre-4.1)密码哈希格式保存 密码。
    •  password new-password
      设 置一个新密码。将用mysqladmin连接服务器使用的 账户的密码更改为new-password。
      如果new-password包 含空格或其它命令解释符的特殊字符,需要用引号将它引起来。在Windows中,一定要使用双引号而不要用单引号;单引号不会 从 密码中剥离出来,而是解释为密码的一部分。例如:
      shell> mysqladmin password "my new password"
    • ping
      检查服务器是否仍活动。如果服务器在运行mysqladmin返 回状态0,如果不运行返回1。即使出现错误例如Access denied也为0,因为这说明服务器在运行但拒绝了连接,与服务器不在运行不同。
    • processlist
      显示活动服务器线程的列表。类似SHOW PROCESSLIST语句的输出。如果给出了--verbose选项,输出类似SHOW FULL PROCESSLIST。
    • reload
      重载授权表。
    • refresh
      刷新所有表并关闭和打开日志文件。
    • shutdown
      停止服务器。
    •  start-slave
      开始从服务器上的复制。
    • status
      显示短服务器状态消息。
    •  stop-slave
      停止从服务器上的复制。
    •  variables
      显示服务器系统变量及其值。
    •  version
      显示服务器的版本信息。

    所有命令可以简化为任何唯一的前缀。例如:

    shell> mysqladmin proc stat +----+-------+-----------+----+---------+------+-------+------------------+
    | Id    | User   | Host      | db | Command | Time | State | Info             | +----+-------+-----------+----+---------+------+-------+------------------+ 
    | 51 | monty | localhost |    | Query   | 0    |       | show processlist | +----+-------+-----------+----+---------+------+-------+------------------+ 
    Uptime: 1473624  Threads: 1  Questions: 39487  Slow queries: 0  Opens: 541  Flush tables: 1  Open tables: 19  Queries per second avg: 0.0268

    mysqladmin status命令的结果显示下面的值:

    • Uptime
      MySQL服务器已经运行的秒数。
    • Threads
      活动线程(客户)的 数目。
    •  Questions
      服务器启动以来客户的问题(查 询)数目。
    • Slow queries
      执行时间超过long_query_time秒 的查询的数量。参见5.11.4节,“慢速查询日志”
    • Opens
      服务器已经打开的数据库表的数量。
    •  Flush tables
      服务器已经执行的flush ...、refresh和reload命令的数量。
    • Open tables
      目前打开的表的数量。
    • Memory in use
      mysqld
      代 码直接分配的内存数量。只有用--with--debug=full编译了MySQL该值才显示。
    •  Maximum memory used
      mysqld
      代 码直接分配的最大内存数量。只有用--with--debug=full编译了MySQL该值才显 示。

    如果当使用Unix套接字文件连接本地服务器时执行mysqladmin shutdownmysqladmin将等待直到 服务器的进程ID文件被删除,以确保服务器正确停止。

    mysqladmin支持下面的选项:

    •  ---help,-?
      显 示帮助消息并退出。
    • --character-sets-dir=path
      字符集的安装目 录。
    • --compress,-C
      压缩客户和服务器之间发送的所 有信息(如果二者均支持压缩)。
    • --count=num,-c num
      迭代数目。该选项只有结合--sleep (-i)才能工作。
    • ---debug[=debug_options],-# [debug_options]
      写调试日志。debug_options字 符串通常为'd:t:o,file_name'。 默认为'd:t:o,/tmp/mysqladmin.trace'。
    • --default-character-set=charset
      使用charsetas作 为默认字符集。
    •  --force,-f
      不再为drop database命令进行确认。对于多个命令,即使出现错误也继续。
    •  --host=host_name,-h host_name
      连接给定主机上的MySQL服务器。
    •  --password[=password],-p[password]
      连 接服务器使用的密码。如果使用短选项形式(-p),该选项和 密码之间不能有空格。如果你在命令行中在--password或-p选 项后面省略 密码值,将提示你输入密码。
    • --port=port_num,-P port_num
      用于连接的TCP/IP端口号。
    • --protocol={TCP | SOCKET | PIPE | MEMORY}
      使用的连接协议。
    • --relative,-r
      当带-I使 用时显示当前和前面值的差别。目前,该选项只用于extended-status命令。
    • --silent,-s
      如果不能建立与服务器的连接则以沉 默方式退出。
    • --sleep=delay,-i delay
      每睡眠delay秒后执行一次 命令。
    • --socket=path,-S path
      用于连接的套接字文件。
    •  --user=user_name,-u user_name
      当连接服务器时使用的MySQL用户名。
    • --verbose,-v
      冗长模式。打印出程序操作的详细 信息。
    •  --version,-V
      显 示版本信息并退出。
    • --vertical,-E
      垂直打印输出。类似于--relative, 但垂直打印输出。
    • --wait[=count],-w[count]
      如 果连接不能建立,等待并重试而不是放弃。如果给出一个选项值,则指示重试的次数。默认是一次。
      也可以使用--var_name=value选 项设置下面的变量:
      • connect_timeout
        连接超时之前的最大秒数。默认值为43200(12小 时)。
      • shutdown_timeout
        等候关闭的最大秒数。默 认值为3600(1小时)。

    也可以使用--set-variable=var_name=value或-O var_name=value语法来设置变量。然而,现在不赞成该语法,并且不再使用。

    MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库

    MYSQL启用日志
    [root@jianshe99]# whereis my.ini
    [root@jianshe99]# vi /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    # Default to using old password format for compatibility with mysql 3.x
    # clients (those using the mysqlclient10 compatibility package).
    old_passwords=1
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    long_query_time =1
    log-slow-queries=slowqueris.log
    log-queries-not-using-indexes = nouseindex.log
    log=mylog.log
    pid-file=/var/run/mysqld/mysqld.pid

    --------------------------------------------------------

    查看日志

    是否启用了日志
    mysql>show variables like 'log_bin';

    怎样知道当前的日志
    mysql> show master status;

    看二进制日志文件用mysqlbinlog
    shell>mysqlbinlog mail-bin.000001
    或者shell>mysqlbinlog mail-bin.000001 | tail

    Windows 下用类似的命令。

    mysql有以下几种日志: 
    错误日志: -log-err 
    查询日志: -log 
    慢查询日志: -log-slow-queries 
    更新日志: -log-update 
    二进制日志: -log-bin 

    在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。
    LAST_UPDATED2
    -------------------------------------------------------------

    如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。关于启用二进制日志的信息,参见5.11.3节,“二进制日志”。对于 mysqlbinlog的详细信息,参见mysql手册8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。

    要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为-- log-bin。要想确定当前的二进制日志文件的文件名,输入下面的MySQL语句:


    SHOW BINLOG EVENTS G


    你还可以从命令行输入下面的内容:


    mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS G'


    将密码my_pwd替换为服务器的root密码。

    1. 指定恢复时间

    对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:


    mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd


    该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:


    mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd


    在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。

    2. 指定恢复位置

    也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:


    mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00"
    /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql


    该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:


    mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd
    mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd


    上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。

     
     
    myisampack 用法 
    工作中接触myisam存储引擎数据库,每天产生大量的数据,磁盘空间告急...,在不增加磁盘下,尝试下mysql中压缩数据工具myisampack....
     
    1.压缩前数据文件大小:
     
    [root@mysql5 testDB]# ls -lh
    total 72M
    -rw-rw---- 1 mysql mysql   61 Jun 11 07:13 db.opt
    -rw-rw---- 1 mysql mysql 8.9K Jun 11 07:16 user_log_2011_12_15.frm
    -rw-rw---- 1 mysql mysql  56M Jun 11 07:17 user_log_2011_12_15.MYD
    -rw-rw---- 1 mysql mysql  16M Jun 11 07:17 user_log_2011_12_15.MYI
    2.使用myisampack工具
    [root@mysql5 testDB]# myisampack ./user_log_2011_12_15.MYI
    Compressing ./user_log_2011_12_15.MYD: (1569132 records)
    - Calculating statistics
    - Compressing file
    68.42%     
    Remember to run myisamchk -rq on compressed tables
    3.显示压缩后数据大小
    Remember to run myisamchk -rq on compressed tables
    [root@mysql5 testDB]# ls -lh
    total 18M
    -rw-rw---- 1 mysql mysql   61 Jun 11 07:13 db.opt
    -rw-rw---- 1 mysql mysql 8.9K Jun 11 07:16 user_log_2011_12_15.frm
    -rw-rw---- 1 mysql mysql  18M Jun 11 07:17 user_log_2011_12_15.MYD
    -rw-rw---- 1 mysql mysql 1.0K Jun 19 22:51 user_log_2011_12_15.MYI
    压缩率达70%,还可以应急下磁盘空间...
    4.还没有完,运行myisampack 后,必须运行myisamchk以重新创建index,我们可以排序index 块并创建mysql优化器需要的统计信息以更有效工具:如下:
    [root@mysql5 testDB]# myisamchk -rq --sort-index --analyze user_log_2011_12_15.MYI
    - check record delete-chain
    - recovering (with sort) MyISAM-table 'user_log_2011_12_15.MYI'
    Data records: 1569132
    - Fixing index 1
    - Sorting index for MyISAM-table 'user_log_2011_12_15.MYI'
    5.接着:
    [root@mysql5 testDB]# mysqladmin flush-tables 以强制使用新的表;
     
    现在的表,只有只读功能;
    要想解压缩一个压缩的表,使用myisamchk的--unpack选项.
     
     
    也许很多人遇到过类似Can’t open file: ‘[Table]mytable.MYI’ 这样的错误信息,却不知道怎么解决他,下面我们做个介绍,
    多数情况下,数据库被破坏只是指索引文件受到了破坏,真正的数据被破坏掉的情况非常少。大多数形式的数据库破坏的的修复相当简单。
    和前面的校验一样,修复的方式也有三种。
    下面讲的方法只对MyISAM格式的表有效。其他类型的损坏需要从备份中恢复。
    1,REPAIR TABLE SQL statement(mysql服务必须处于运行状态)。
    2,命令mysqlcheck(mysql服务可以处于运行状态)。
    3,命令myisamchk(必须停掉mysql服务,或者所操作的表处于不活动状态)。
    在修复表的时候,最好先作一下备份。所以你需要两倍于原始表大小的硬盘空间。请确保在进行修复前你的硬盘空间还没有用完。
    1>用”repair table”方式修复
    语法:repair table 表名 [选项]
    选项如下:
    QUICK 用在数据表还没被修改的情况下,速度最快
    EXTENDED 试图去恢复每个数据行,会产生一些垃圾数据行,万般无奈的情况下用
    USE_FRM 用在.MYI文件丢失或者头部受到破坏的情况下。利用.frm的定义来重建索引
    多数情况下,简单得用”repair table tablename”不加选项就可以搞定问题。但是当.MYI文件丢失或者头部受到破坏时,这样的方式不管用,例如:
    mysql> REPAIR TABLE mytable;
    +————————-+——–+———-+———————————————+
    | Table | Op | Msg_type | Msg_text |
    +————————-+——–+———-+———————————————+
    | sports_results.mytable | repair | error | Can’t find file: ‘mytable.MYI’ (errno: 2) |
    +————————-+——–+———-+———————————————+
    修复失败的原因时索引文件丢失或者其头部遭到了破坏,为了利用相关定义文件来修复,需要用USE_FRM选项。例如:
    mysql> REPAIR TABLE mytable USE_FRM;
    +————————-+——–+———-+————————————+
    | Table | Op | Msg_type | Msg_text |
    +————————-+——–+———-+————————————+
    | sports_results.mytable | repair | warning | Number of rows changed from 0 to 2 |
    | sports_results.mytable | repair | status | OK |
    +————————-+——–+———-+————————————+
    我们可以看到Msg_test表项的输出信息”ok”,表名已经成功修复受损表。
    2>用mysql内建命令mysqlcheck来修复
    当mysql服务在运行时,也可以用mysql内建命令mysqlcheck来修复。
    语法:mysqlcheck -r 数据库名 表名 -uuser -ppass
    %mysqlcheck -r sports_results mytable -uuser -ppass
    sports_results.mytable OK
    利用mysqlcheck可以一次性修复多个表。只要在数据库名后列出相应表名即可(用空格隔开)。或者数据库名后不加表名,将会修复数据库中的所有表,例如:
    %mysqlcheck -r sports_results mytable events -uuser -ppass
    sports_results.mytable OK
    sports_results.events OK

    %mysqlcheck -r sports_results -uuser -ppass
    sports_results.mytable OK
    sports_results.events OK
    3>用myisamchk修复
    用这种方式时,mysql服务必须停掉,或者所操作的表处于不活动状态(选项skip-external-locking没被使用)。记着一定要在相关.MYI文件的路径下或者自己定义其路径。
    语法:myisamchk [选项] [表名]
    下面是其选项和描述
    –backup, -B 在进行修复前作相关表得备份
    –correct-checksum 纠正校验和
    –data-file-length=#, -D # 重建表时,指定数据文件得最大长度
    –extend-check, -e 试图去恢复每个数据行,会产生一些垃圾数据行,万般无奈的情况下用
    –force, -f 当遇到文件名相同的.TMD文件时,将其覆盖掉。
    keys-used=#, -k # 指定所用的keys可加快处理速度,每个二进制位代表一个key.第一个key为0
    –recover, -r 最常用的选项,大多数破坏都可以通过它来修复。如果你的内存足够大,可以增大参数sort_buffer_size的值来加快恢复的速度。但是遇到唯一键由于破坏而不唯一 的表时,这种方式不管用。
    –safe-recover -o 最彻底的修复方式,但是比-r方式慢,一般在-r修复失败后才使用。这种方式读出 所有的行,并以行为基础来重建索引。它的硬盘空间需求比-r方式稍微小一点,因 为它没创建分类缓存。你可以增加key_buffer_size的值来加快修复的速度。
    –sort-recover, -n mysql用它类分类索引,尽管结果是临时文件会非常大
    –character-sets-dir=… 包含字符集设置的目录
    –set-character-set=name 为索引定义一个新的字符集
    –tmpdir=path, -t 如果你不想用环境变量TMPDIR的值的话,可以自定义临时文件的存放位置
    –quick, -q 最快的修复方式,当数据文件没有被修改时用,当存在多键时,第二个-q将会修改 数据文件
    –unpack, -u 解开被myisampack打包的文件
    myisamchk应用的一个例子
    % myisamchk -r mytable
    - recovering (with keycache) MyISAM-table ‘mytable.MYI’
     
     
     

    mysqldump备份还原和mysqldump导入导出语句大全详解 转

    mysqldump备份还原和mysqldump导入导出语句大全详解

    mysqldump备份

    mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径

    案例:

    mysqldump -uroot -p1234 -hlocalhost db1 a -w "id in (select id from b)" --lock-all-tables > c:aa.txt

    mysqldump还原

    mysqldump -u用户名 -p密码 -h主机 数据库 < 路径

    案例:

    mysql -uroot -p1234 db1 < c:aa.txt

    mysqldump按条件导出

    mysqldump -u用户名 -p密码 -h主机 数据库  a --where "条件语句" --no-建表> 路径

    mysqldump -uroot -p1234 dbname a --where "tag='88'" --no-create-info> c:a.sql

    mysqldump按导入

    mysqldump -u用户名 -p密码 -h主机 数据库 < 路径

    案例:

    mysql -uroot -p1234 db1 < c:a.txt

    mysqldump导出表

    mysqldump -u用户名 -p密码 -h主机 数据库 表

    案例:

    mysqldump -uroot -p sqlhk9 a --no-data

    讲一下 mysqldump 的一些主要参数

    --compatible=name 
    它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。 
    --complete-insert,-c 
    导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。 
    --default-character-set=charset 
    指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
    --disable-keys 
    告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。
    --extended-insert = true|false 
    默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。 
    --hex-blob 
    使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
    --lock-all-tables,-x 
    在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction 和 --lock-tables 选项。
    --lock-tables 
    它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。
    --no-create-info,-t 
    只导出数据,而不添加 CREATE TABLE 语句。
    --no-data,-d 
    不导出任何数据,只导出数据库表结构。
    --opt 
    这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
    --quick,-q 
    该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
    --routines,-R 
    导出存储过程以及自定义函数。
    --single-transaction 
    该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。
    本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
    要想导出大表的话,应结合使用 --quick 选项。 
    --triggers 
    同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。
    其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表:
    /usr/local/mysql/bin/mysqldump -uyejr -pyejr "
    --default-character-set=utf8 --opt --extended-insert=false "
    --triggers -R --hex-blob -x db_name > db_name.sql
    使用以下 SQL 来备份 Innodb 表:
    /usr/local/mysql/bin/mysqldump -uyejr -pyejr "
    --default-character-set=utf8 --opt --extended-insert=false "
    --triggers -R --hex-blob --single-transaction db_name > db_name.sql
    另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下:
    /usr/local/mysql/bin/mysqldump -uyejr -pyejr "
    --default-character-set=utf8 --opt --master-data=1 "
    --single-transaction --flush-logs db_name > db_name.sql
    它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER 语句来指定当前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。

    1.2 还原
    用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。
    直接用 mysql 客户端 
    例如:
    /usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
    用 SOURCE 语法 (实验不成功!!!) 
    其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:
    SOURCE /tmp/db_name.sql;
    这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。

     
     
     

    mysqlhotcopy使用lock tables、flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能用于备份MyISAM存储引擎和运行在数据库目录所在的机器上.与mysqldump备份不同,mysqldump属于逻辑备份,备份时是执行的sql语句.使用mysqlhotcopy命令前需要要安装相应的软件依赖包.

    1.安装mysqlhotcopy所依赖的软件包(perl-DBD,DBD-mysql)

    [root@tong2 ~]# yum install perl-DBD* -y

    [root@tong2 ~]# wget https://cpan.metacpan.org/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.029.tar.gz

    [root@tong2 ~]# tar xvf DBD-mysql-4.029.tar.gz

    [root@tong2 ~]# cd DBD-mysql-4.029
    [root@tong2 DBD-mysql-4.029]# perl Makefile.PL

    [root@tong2 DBD-mysql-4.029]# make

    [root@tong2 DBD-mysql-4.029]# make install

    [root@tong2 DBD-mysql-4.029]# echo $?
    0
    [root@tong2 DBD-mysql-4.029]# cd 
    [root@tong2 ~]#

    2.查看mysqlhotcopy的帮助信息

    [root@tong2 ~]# vim /usr/my.cnf    --在配置文件中添加如下参数

    [mysqlhotcopy]
    interactive-timeout
    host=localhost
    user=root
    password=system
    port=3306

    [root@tong2 ~]# /etc/init.d/mysql restart      --重启服务
    Shutting down MySQL.. SUCCESS! 
    Starting MySQL. SUCCESS!

    [root@tong2 ~]# mysqlhotcopy  --help
    Warning: /usr/bin/mysqlhotcopy is deprecated and will be removed in a future version.

    /usr/bin/mysqlhotcopy Ver 1.23

    Usage: /usr/bin/mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]

      -?, --help          display this help-screen and exit
      -u, --user=#        user for database login if not current user
      -p, --password=#    password to use when connecting to server (if not set
                          in my.cnf, which is recommended)
      -h, --host=#        hostname for local server when connecting over TCP/IP
      -P, --port=#        port to use when connecting to local server with TCP/IP
      -S, --socket=#      socket to use when connecting to local server
          --old_server    connect to old MySQL-server (before v5.5) which
                          doesn't have FLUSH TABLES WITH READ LOCK fully implemented.

      --allowold          don't abort if target dir already exists (rename it _old)    --不覆盖以前备份的文件
      --addtodest          don't rename target dir if it exists, just add files to it      --属于增量备份
      --keepold            don't delete previous (now renamed) target when done
      --noindices          don't include full index files in copy          --不备份索引文件
      --method=#          method for copy (only "cp" currently supported)

      -q, --quiet          be silent except for errors
      --debug              enable debug                                          --启用调试输出
      -n, --dryrun        report actions without doing them

      --regexp=#          copy all databases with names matching regexp  --使用正规表达式
      --suffix=#          suffix for names of copied databases
      --checkpoint=#      insert checkpoint entry into specified db.table    --插入检查点条目
      --flushlog          flush logs once all tables are locked                    --所有表锁定后刷新日志
      --resetmaster        reset the binlog once all tables are locked        --一旦锁表重置binlog文件
      --resetslave        reset the master.info once all tables are locked  --一旦锁表重置master.info文件 

      --tmpdir=#        temporary directory (instead of /tmp)
      --record_log_pos=#  record slave and master status in specified db.table
      --chroot=#          base directory of chroot jail in which mysqld operates

      Try 'perldoc /usr/bin/mysqlhotcopy' for more complete documentation
    [root@tong2 ~]#

    3.备份一个数据库到一个目录中

    [root@tong2 ~]# mysqlhotcopy -u root -p system tong /opt/

    [root@tong2 ~]# ll /opt/tong/
    total 112
    -rw-rw----. 1 mysql mysql    15 Jan  5 14:35 q.isl
    -rw-rw----. 1 mysql mysql  8554 Jan  4 18:03 t.frm
    -rw-rw----. 1 mysql mysql 98304 Jan  4 18:03 t.ibd
    [root@tong2 ~]# ll /var/lib/mysql/tong
    total 112
    -rw-rw----. 1 mysql mysql    15 Jan  5 14:35 q.isl
    -rw-rw----. 1 mysql mysql  8554 Jan  4 18:03 t.frm
    -rw-rw----. 1 mysql mysql 98304 Jan  4 18:03 t.ibd
    [root@tong2 ~]#

    4.备份多个数据库到一个目录中

    [root@tong2 ~]# mysqlhotcopy -u root -p system tong mysql /opt/tong

    [root@tong2 ~]# ll /opt/
    total 8
    drwxr-x---. 2 mysql mysql 4096 Jan  5 15:29 mysql
    drwxr-x---. 2 mysql mysql 4096 Jan  5 15:29 tong

    [root@tong2 ~]# ll /var/lib/mysql/{mysql,tong} -d
    drwxr-xr-x. 2 mysql mysql 4096 Jan  5 15:29 /var/lib/mysql/mysql
    drwxr-xr-x. 2 mysql mysql 4096 Jan  5 15:29 /var/lib/mysql/tong
    [root@tong2 ~]#

    5.备份数据库中某一个表

    [root@tong2 ~]# mysqlhotcopy -u root -p system mysql./user*/ /opt/

    [root@tong2 ~]# ll /opt/mysql/
    total 20
    -rw-r--r--. 1 mysql mysql 10684 Jan  4 16:49 user.frm
    -rw-r--r--. 1 mysql mysql  784 Jan  4 16:49 user.MYD
    -rw-r--r--. 1 mysql mysql  2048 Jan  4 16:49 user.MYI

    [root@tong2 ~]# ll /var/lib/mysql/mysql/user.*
    -rw-r--r--. 1 mysql mysql 10684 Jan  4 16:49 /var/lib/mysql/mysql/user.frm
    -rw-r--r--. 1 mysql mysql  784 Jan  4 16:49 /var/lib/mysql/mysql/user.MYD
    -rw-r--r--. 1 mysql mysql  2048 Jan  4 16:49 /var/lib/mysql/mysql/user.MYI
    [root@tong2 ~]#

    6.恢复数据

    [root@tong2 ~]# rm -rf /var/lib/mysql/tong
    [root@tong2 ~]# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 29
    Server version: 5.6.21-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    mysql> show databases;
    +--------------------+
    | Database          |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test              |
    +--------------------+
    4 rows in set (0.00 sec)

    mysql> exit
    Bye

    [root@tong2 ~]# cp -arp /opt/tong /var/lib/mysql/        --将备份的数据移到mysql数据根目录
    [root@tong2 ~]# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 30
    Server version: 5.6.21-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

    mysql> u tong
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_tong |
    +----------------+
    | t              |
    +----------------+
    2 rows in set (0.00 sec)

    mysql> exit
    Bye

    [root@tong2 ~]#

    mysqlimport简介

     

    mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。

    选项:

    --host=host_name,-h host_name

    将数据导入给定主机上的MySQL服务器。默认主机是localhost

    --local,-L

    从本地客户端读入输入文件。

    --lock-tables,-l

    处理文本文件前锁定所有表以便写入。这样可以确保所有表在服务器上保持同步。

    --password[=password],-p[password]

    当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中--password-p选项后面没有 密码值,则提示输入一个密码。

    --port=port_num,-P port_num

    用于连接的TCP/IP端口号。

    --protocol={TCP | SOCKET | PIPE | MEMORY}

    使用的连接协议。

    --replace,-r

    --replace和--ignore选项控制复制唯一键值已有记录的输入记录的处理。如果指定--replace,新行替换有相同的唯一键值的已有行。如果指定--ignore,复制已有的唯一键值的输入行被跳过。如果不指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。

    --fields-terminated-by=... //字段分隔符

    示例

    shell> mysqlimport --local test imptest.txt

    test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

     

     

     

     

     

    SHOW CHARACTER SET

    显示所有可用的字符集

    SHOW CHARACTER SET;
    SHOW CHARACTER SET LIKE 'latin%';

    SHOW COLLATION

    输出包括所有可用的字符集

    SHOW COLLATION;
    SHOW COLLATION LIKE 'latin1%';

    SHOW COLUMNS

    显示在一个给定表中的各列的信息,对于视图,本语句也起作用。

    SHOW COLUMNS FROM mydb.mytable;
    SHOW COLUMNS FROM mytable FROM mydb;

    SHOW CREATE DATABASE

    显示用于创建给定数据库CREATE DATABASE语句。也可以使用SHOW CREATE SCHEMA。

    SHOW CREATE DATABASE test;
    SHOW CREATE DATABASE testG;

    SHOW CREATE TABLE

    SHOW CREATE TABLE java;
    SHOW CREATE TABLE javaG;

    SHOW DATABASES

    SHOW DATABASES可以在MySQL服务器主机上列举数据库。您也可以使用mysqlshow命令得到此清单。您只能看到您拥有某些权限的数据库,除非您拥有全局SHOW DATABASES权限。

    SHOW DATABASES;

    SHOW ENGINE

    SHOW ENGINE显示存储引擎的日志或状态信息。目前支持以下语句:

    SHOW ENGINE BDB LOGS;
    SHOW ENGINE INNODB STATUS;

    SHOW ENGINES

    SHOW ENGINES显示存储引擎的状态信息。对于检查一个存储引擎是否被支持,或者对于查看默认引擎是什么,本语句十分有用。

    SHOW ENGINES;
    SHOW ENGINESG;

    SHOW ERRORS

    该语句只显示错误,不同时显示错误、警告和注意。

    SHOW COUNT(*) ERRORS;
    SHOW ERRORS;

    SHOW GRANTS

    SHOW GRANTS;
    SHOW GRANTS FOR user;
    SHOW GRANTS FOR CURRENT_USER;
    SHOW GRANTS FOR CURRENT_USER();

    SHOW INDEX

    SHOW INDEX会返回表索引信息。

    SHOW INDEX FROM mydb.mytable;
    SHOW INDEX FROM mytable FROM mydb;

    SHOW INNODB STATUS

    这是SHOW ENGINE INNODB STATUS的同义词,但不赞成使用。

    SHOW LOGS

    这是SHOW ENGINE BDB LOGS的同义词,但是不赞成使用。

    SHOW OPEN TABLES

    列举在表缓存中当前被打开的非TEMPORARY表。

    SHOW OPEN TABLES;

    SHOW PRIVILEGES

    显示MySQL服务器支持的系统权限清单。确切的输出根据您的服务器的版本而定

    SHOW PRIVILEGES;

    SHOW PROCESSLIST

    显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程


    SHOW STATUS

    提供服务器状态信息。此信息也可以使用mysqladmin extended-status命令获得。

    SHOW STATUS;

    SHOW TABLE STATUS

    SHOW TABLE STATUS的性质与SHOW TABLE类似,不过,可以提供每个表的大量信息。您也可以使用mysqlshow --status db_name命令得到此清单。

    本语句也显示视图信息。

    SHOW TABLE STATUS;
    SHOW TABLE STATUS FROM test;

    SHOW TABLES

    SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令得到此清单。

    SHOW TABLES;

    SHOW TRIGGERS

    SHOW TRIGGERS列出了目前被MySQL服务器定义的触发程序。

    SHOW TRIGGERS;

    SHOW VARIABLES

    SHOW VARIABLES;
    SHOW GLOBAL VARIABLES;
    SHOW SESSION VARIABLES;
    SHOW VARIABLES LIKE 'have%';

    SHOW WARNINGS

    显示由上一个生成消息的语句导致的错误、警告和注意消息。如果上一个使用表的语句未生成消息,则什么也不显示。SHOW ERRORS是其相关语句,只显示错误。

    SHOW COUNT(*) WARNINGS;
    SHOW WARNINGS;

    perror的使用方法 

    在mysql的使用过程中遇见很多错误,比如由于操作系统引起的,文件或者目录不存在,或者sql语句错误引起的。这些error 会有相应的代码:error#,Errcode#。"#"代表具体的错误号。perror可以查看这些错误的详细内容。
    查看perror的使用方法:
    [root@YANG mysql]# perror 
    perror Ver 2.10, for pc-linux-gnu (i686)
    This software comes with ABSOLUTELY NO WARRANTY. This is free software,
    and you are welcome to modify and redistribute it under the GPL license

    Print a description for a system error code or an error code from
    a MyISAM/ISAM/BDB table handler.
    If you want to get the error for a negative error code, you should use
    -- before the first error code to tell perror that there was no more options.

    Usage: perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
      -?, --help          Displays this help and exits.
      -I, --info          Synonym for --help.
      --ndb               Ndbcluster storage engine specific error codes.
      -s, --silent        Only print the error message.
      -v, --verbose       Print error code and message (default).
      -V, --version       Displays version information and exits.

    Variables (--variable-name=value)
    and boolean options {FALSE|TRUE}  Value (after reading options)
    --------------------------------- -----------------------------
    ndb                               FALSE
    verbose                           TRUE

    [root@YANG mysql]# perror 30 60
    OS error code  30:  Read-only file system
    OS error code  60:  Device not a stream

    REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY

    KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。 
    注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该

    语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。


    所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这

    和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“

    SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT

    (col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

    为了能够使用REPLACE,您必须同时拥有表的INSERT和DELETE权限。


    REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和

    。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1

    ,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制

    了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。


    受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行

    :检查该数是否为1(添加)或更大(替换)。

    1. 尝试把新行插入到表中

    2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:

    a. 从表中删除含有重复关键字值的冲突行

    b. 再次尝试把新行插入到表中

    REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},…),(…),…
    或:

    REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, …
    或:

    REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT …

    REPLACE INTO `table` (`unique_column`,`num`) VALUES ('$unique_value',$num);跟INSERT INTO `table` (`unique_column`,`num`) VALUES('$unique_value',$num) ON DUPLICATE UPDATE num=$num;还是有些区别的.
    区别就是replace into的时候会删除老记录。如果表中有一个自增的主键。
    那么就要出问题了。

    首先,因为新纪录与老记录的主键值不同,所以其他表中所有与本表老数据主键id建立的关联全部会被破坏。

    其次,就是,频繁的REPLACE INTO 会造成新纪录的主键的值迅速增大。
    总有一天。达到最大值后就会因为数据太大溢出了。就没法再插入新纪录了。数据表满了,不是因为空间不够了,而是因为主键的值没法再增加了。

     

  • 相关阅读:
    MySQL数据库的优化
    PHP中获取文件扩展名
    PHP实现几种经典算法详解
    Linux服务器上crontab定时执行脚本文件
    LeetCode每日一题(五):加一
    巧妙利用枚举找出数组元素所在区间
    PHP实现几种经典算法详解
    _initialize() 区别 __construct()
    LeetCode每日一题(四):搜索插入位置
    LeetCode每日一题(三):移除元素
  • 原文地址:https://www.cnblogs.com/chunguang/p/4516015.html
Copyright © 2011-2022 走看看