linux部署tomcat到管理tomcat常用

相关传输命令:

zip -r myzip.zip  /root/myfolder

unzip myzip

cp -r /root/back  /root/…./ROOT

whereis httpd

weget http://….jdk.bin

ps -aux | grep java 查看进程
kill -9 12345 【-9 强制】

定时任务【数据库备份命令】

安装字体【生成PDF文件使用】
/usr/share/fonts/truetype/simsun/simsun.ttc

=============
java环境变量
生成PDF字体安装
MYSQL备份脚本
MYSQL数据库添加
APACHE代理设置
TOMCAT端口设置
jmagick安装

自动启动TOMCAT vi /etc/rc.d/rc.local

export JDK_HOME=/usr/local/java/jdk1.6.0_13
export JAVA_HOME=/usr/local/java/jdk1.6.0_13
/usr/local/java/tomcat-sinykk/bin/startup.sh

=====================================================================
mysql 操作

查看mysql状态: service mysqld status;

查看所有用户
select user,host,password from mysql.user;

创建用户
GRANT ALL PRIVILEGES ON xiaochun51itsns.* TO xiaochun51itsns@”%”  IDENTIFIED BY “xiaochun51itsns123” ;

mysql> GRANT ALL ON *.* TO admin@’%’ IDENTIFIED BY ‘admin’ WITH GRANT OPTION;     
mysql> flush privileges;

1>这句话的意思 ,允许任何IP地址(上面的 % 就是这个意思)的电脑 用admin帐户  和密码(admin)来访问这个MySQL Server     

2>必须加类似这样的帐户,才可以远程登陆。 root帐户是无法远程登陆的,只可以本地登陆 

mysql> create database uch_blog character set utf8;
mysql> use uch_blog;
mysql> set names utf8;
mysql> source e:/sinykk_db.sql;

==========================================
关机命令:
1、halt 立刻关机
2、poweroff 立刻关机
3、shutdown -h now 立刻关机(root用户使用)
4、shutdown -h 10 10分钟后自动关机
如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消重启

重启命令:
1、reboot
2、shutdown -r now 立刻重启(root用户使用)
3、shutdown -r 10 过10分钟自动重启(root用户使用)
4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用)
如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启

=============================
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

  crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数

  crontab -l //列出某个用户cron服务的详细内容

  crontab -r //删除没个用户的cron服务

  crontab -e //编辑某个用户的cron服务

  比如说root查看自己的cron设置:crontab -u root -l

  再例如,root想删除fred的cron设置:crontab -u fred -r

  在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

========================
安装imagemagick

yum install ImageMagick

convert aa.jpg bb.jpg

================================================

查看IP,VM无线这个可能不能查
ifconfig

查看linux版本

cat /proc/version

用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart)
查看CPU信息:cat /proc/cpuinfo
查看板卡信息:cat /proc/pci
查看PCI信息:lspci (相比cat /proc/pci更直观)
查看内存信息:cat /proc/meminfo
free
查看USB设备:cat /proc/bus/usb/devices
查看键盘和鼠标:cat /proc/bus/input/devices
查看系统硬盘信息和使用情况:fdisk & disk – l & df
查看磁盘分区表及分区结构 fdisk -l
查看硬盘信息 df -lh
查看各设备的中断请求(IRQ):cat /proc/interrupts
查看启动硬件检测信息日志:dmesg more /var/log/dmesg

MySql中文乱码解决方案

====================================

        中文乱码解决方案

====================================

 

说明: 在MYSQL中,如果使用缺省的字符集,在建库、建表时,默认使用的是latin1字符集,

 

为ISO 8859-1西欧字符集。插入中文字符时,与之不匹配,就会出现乱码。

 

【解决方案】

 

1. 打开文件: C:\Program Files\MySQL\MySQL Server 5.0\my.ini;

 

2. 将其中所有的default-character-set=latin1改为default-character-set=gb2312,

 

   然后重启MYSQL(以前建立的数据库需重建);

 

   测试: 运行MySQL Command Line Client:

 

         输入show variables like ‘character_set_%’;

 

         可以查看数据库的字符编码如下:

 

 

   mysql> show variables like ‘character_set_%’; 

+————————–+—————————————–+ 

| Variable_name             | Value                                     

+————————–+—————————————–+ 

| character_set_client      | gb2312                                    

| character_set_connection  | gb2312                                   

| character_set_database    | gb2312                                   

| character_set_filesystem  | binary                                    

| character_set_results     | gb2312                                   

| character_set_server      | gb2312                                   

| character_set_system      | utf8                                     

| character_sets_dir        | …… 

+————————–+—————————————–+ 

 

3. 将程序中连接数据库的URL改为(此项非必须):

 

   “jdbc:mysql://localhost:3306/jiyuanpeng useUnicode=true&characterEncoding=gb2312”

Tomcat中数据源的配置及原理

一:数据源介绍 数据源简介

JDBC2.0提供了javax.sql.DataSource的接口,负责与数据库建立连接,实际应用时不需要编写连接数据库代码,可以直接从数据源获得数据库的连接,使得应用于数据库的耦合降低。

 

Dataource中事先建立了多个数据库连接,这些数据库连接保持在数据库连接池中,当程序访问数据库时,只需要从连接池从取出空闲的连接,访问数据库结束,在将这些连接归还给连接池。DataSource对象由容器(Tomcat)提供,不能使用创建实例的方法来生成DataSource对象,要采用JAVA的JNDI(Java Nameing and Directory Interface,java命名和目录接口)来获得DataSource对象的引用。(另有一种说法:“其实从技术上来说,数据源连接方式是不需要目录服务的,我们同样可以通过序列化数据源对象直接访问文件系统。这点是需要明确的。”感兴趣的朋友可以试试。)

 

JNDI是一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字相绑定。程序中可以通过这个名字来获得对象的引用。Tomcat把DataSource作为一种可配置的JNDI资源来处理,生成DataSource对象的工厂为rg.apache.comm.ons.dbcp.BasicDataSourceFactory。

 

二:配置数据源

配置数据源其实相当简单,可以配置单个应用的数据源,也可以配置整个容器的数据源。以下详细说明如何配置单个应用的数据源。

 

1.准备工作

Tomcat4.1.24 (其它版本也可以,原理相通的) 

确认在%Tomcat _Home%\common\lib下有commons-collections.jar、commons-dbcp.jar、commons-pool.jar包(tomcat默认有这些包),如果没现有,请到此地下载:http://tomcat.apache.org/ 。这三个包是必需的。

 

下载相应数据库驱动,放在%Tomcat _Home%\common\lib下。本例以oracle数据库为例,使用的驱动包为:jdbc14.jar, 数据库为Oracle9i,确认在%Tomcat _Home%\common\lib下有jndi.jar、dbc2_0-stdext.jar(tomcat默认有这些包)。

 

2.配置单个应用的数据源

2.1配置server.xml文件

首先打开%Tomcat _Home%\conf下 server.xml文件,在相应的<Context>中加入<Resource>元素,在<Context>(你的应用配置上下文)中加入以下代码(以MySql为例):

 

 

<Context path="/test" docBase="E:\JAVA\mytest\webapp" > 

    <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/> 

    <ResourceParams name="jdbc/test"> 

       <parameter> 

           <name>username</name> 

           <value>root</value> 

       </parameter> 

       <parameter> 

           <name>password</name> 

           <value></value> 

       </parameter> 

       <parameter> 

           <name>driverClassName</name> 

           <value>com.mysql.jdbc.Driver</value> 

       </parameter> 

       <parameter> 

           <name>url</name> 

           <value>jdbc:mysql://localhost/dlog</value> 

       </parameter> 

    </ResourceParams> 

</Context>

 

2.2< Resource >配置说明如下:

 

描述

name

指定ResourceJNDI的名字

auth

指定管理ResourceManager,由两个可选值:ContainerApplicationContainer表示由容器来创建和管理ResourceApplication表示由WEB应用来创建和管理Resource。如果在web application deployment descriptor中使用<resource-ref>,这个属性是必需的,如果使用<resource-env-ref>,这个属性是可选的。

type

指定Resource所属的java类名

 

2.3<ResourceParams>元素的属性如下:

 

描述

name

指定ResourceParamsJNDI的名字,必须和Resourcename保持一致

factory

指定生成DataSource对象的factory的类名

maxActive

指定数据库连接池中处于活动状态的数据库连接最大数目,0表示不受限制

maxldle

指定数据库连接池中处于空闲状态的数据库连接的最大数目,0表示不受限制

maxwait

指定数据库连接池中的数据库连接处于空闲状态的最长时间(单位为毫秒),超过这一事件,将会抛出异常。-1表示可以无限期等待。

username

指定连接数据库的用户名

password

指定连接数据库的密码

driverClassName

指定连接数据库的JDBC驱动程序

url

指定连接数据库的URL

 

 

2.3引用数据源

 如果在web应用中访问了由Servlet容器管理的某个JNDI Resource,则必须在web.xml中声明对这个JNDI Resource的引用。表示资源引用的元素为<resource-ref>,该元素加在<wepapp></ wepapp >中。

 打开你的应用配置文件web.xml,输入以下粗体部分:

 <wepapp> ……

<resource-ref>

       <description>connectDB test</description>

       <res-ref-name>jdbc/test</res-ref-name>

       <res-type>javax.sql.DataSource</res-type>

       <res-auth>Container</res-auth>

    </resource-ref>

</ wepapp >

 

2.4<resource-ref>元素的属性如下:

 描述:description  对所引用的资源的说明;
res-ref-name 指定所引用资源的JNDI名字,与<Resource>元素中的name属性保持一致;
res-type  指定所引用资源的类名字,与<Resource>元素中的type属性保持一致;

res-auth  指定所引用资源的Manager,与<Resource>元素中的auth属性保持一致;

 

2.5测试数据源   

 首先,检查Tomcat的%Tomcat _Home%\common\lib下有commons-collections.jar、commons-dbcp.jar、commons-pool.jar包,如果没现有,请到此地下载:http://tomcat.apache.org/    

 注意以上三个包不要引入你的工程类路径,否则可能报错。

 

 然后,将驱动包放入%Tomcat _Home%\common\lib下,注意包必须为.jar后缀。Tomcat只认.jar包。 配置完成后,写个测试,如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD 
HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("jdbc/myoracle ");

//javablogorl为<Resource>元素中name属性的值
Connection conn = db.getConnection( );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
while(rs.next()){
out.print(rs.getString("admin_name")+" ");
out.print(rs.getString("admin_password")+"<br>");
}
rs.close();
stmt.close();
conn.close(); 

%>
</body>
</html>

 

 如果输出你期望的结果,表示数据源配置成功。

 

3.配置容器全局数据源
以上配置的数据源为单个应用使用的数据源,只能为单个应用所使用,下面我们配置全局的数据源,所有的应用都可以使用,通过引用很自然的使用全局数据源。准备工作同上。

3.1 配置server.xml文件

首先打开%Tomcat _Home%\conf下 server.xml文件,在<GlobalNamingResources>下输入以下粗体部分:

 

<GlobalNamingResources> ……


    <Context path="/test" docBase="E:\JAVA\mytest\webapp" > 

    <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"/> 

    <ResourceParams name="jdbc/test"> 

       <parameter> 

           <name>username</name> 

           <value>root</value> 

       </parameter> 

       <parameter> 

           <name>password</name> 

           <value></value> 

       </parameter> 

       <parameter> 

           <name>driverClassName</name> 

           <value>com.mysql.jdbc.Driver</value> 

       </parameter> 

       <parameter> 

           <name>url</name> 

           <value>jdbc:mysql://localhost/dlog</value> 

           </parameter> 

        </ResourceParams> 

</Context>

</GlobalNamingResources>

 

 

3.2 引用数据源

由于我们配置的是容器全局数据源,因此所有的应用都可以引用这个数据源。在你的应用中建立引用,在<Context></Context>之间输入以下粗体部分:

<Context path="/test" docBase="E:\JAVA\mytest\webapp" >

<ResourceLink name="myDB" global="jdbc/test"  type="javax.sql.DataSource"/>

</Context>

 

3.3 配置应用文件web.xml

打开你的应用配置文件web.xml,输入以下粗体部分:

 

<wepapp> …… 

<resource-ref>

       <description>connectDB test</description>

       <res-ref-name>jdbc/test</res-ref-name>

       <res-type>javax.sql.DataSource</res-type>

       <res-auth>Container</res-auth>

    </resource-ref>

</ wepapp >

 

 3.4测试  创建测试文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD 
HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("myDB ");//名称与web.xml配置中的一致

//javablogorl为<Resource>元素中name属性的值
Connection conn = db.getConnection( );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test");
while(rs.next()){
out.print(rs.getString("admin_name")+" ");
out.print(rs.getString("admin_password")+"<br>");
}
rs.close();
stmt.close();
conn.close();

%>
</body>
</html>

 

 

如果输出你期望的结果,表示数据源配置成功。

Hibernate.cfg.xml文件中删除所有连接数据库的配置参数,添加connection.datasource属性,其中jdbc/test为数据源在应用服务器中的JNDI名:

<property name=”connection.datasource”>java:/comp/env/jdbc/test</property>

 

 

转mysql的一些东西。平常不常用。

14.5.3 SET 和 SHOW 语法

SET 可以用于设置各种变量或者选项。

SHOW 可以以各种形式描述数据库系统的信息,诸如数据表,字段,服务器状态等等。大致有以下这些方法:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE ‘pattern’]

SHOW CREATE DATABASE db_name

SHOW CREATE TABLE tbl_name

SHOW DATABASES [LIKE ‘pattern’]

SHOW [STORAGE] ENGINES

SHOW ERRORS [LIMIT [offset,] row_count]

SHOW GRANTS FOR user

SHOW INDEX FROM tbl_name [FROM db_name]

SHOW INNODB STATUS

SHOW [BDB] LOGS

SHOW PRIVILEGES

SHOW [FULL] PROCESSLIST

SHOW STATUS [LIKE ‘pattern’]

SHOW TABLE STATUS [FROM db_name] [LIKE ‘pattern’]

SHOW [OPEN] TABLES [FROM db_name] [LIKE ‘pattern’]

SHOW [GLOBAL | SESSION] VARIABLES [LIKE ‘pattern’]

SHOW WARNINGS [LIMIT [offset,] row_count]

如果 SHOW 语法中包括 LIKE ‘pattern’ 分句的话,’pattern’ 是一个可以包括 SQL 语法中‘ % ‘和‘ _ ‘等通配符的字符串。这个模式语句对于取得相应的结果十分有用。

请注意,还有以下几种不同的标识方式:

SET PASSWOR 语句用于设定帐户的密码,详情请看“14.5.1.3 SET PASSWORD Syntax”。

SHOW 语句有以下几种方式用于描述复制主服务器和从服务器的信息:

SHOW BINLOG EVENTS

SHOW MASTER LOGS

SHOW MASTER STATUS

SHOW SLAVE HOSTS

SHOW SLAVE STATUS

   

这些格式的 SHOW 详细描述详情请看“14.6 Replication Statements”。

14.5.3.1 SET 语法

SET variable_assignment [, variable_assignment] …

variable_assignment:

      user_var_name = expr

    | [GLOBAL | SESSION] system_var_name = expr

    | @@[global. | session.]system_var_name = expr

SET 可以设置各种不同的变量类型,这些变量可以影响着服务器或者客户端的参数。它可以帮助你设置用户变量或者是系统变量。

在 MySQL 4.0.3 中,我们增加了 GLOBAL 和 SESSION 选项,并且可以在运行时动态修改系统中最重要的参数。这些可以被动态修改的系统参数详情请看“5.2.3.1 Dynamic System Variables”中会被详细描述到。

在老版本的 MySQL 中,SET 其实是 SET OPTION 的代替,它少了 OPTION 这个参数,不过现在不推荐的使用方法。

以下这个例子演示了几种使用设置变量的方法。

用户变量写成 @var_name,用以下方法来设置:

SET @var_name = expr;

用户变量的特性说明将在章节“10.3 User Variables”中提到。

系统变量在 SET 语法中可以以 var_name 的方式来引用。变量名前面用 GLOBAL 或 @@global. 来表示这是一个全局变量,用 SESSION , @@session. 或 @@ 来表示这是一个会话变量。 LOCAL 和 @@local. 其实 SESSION 和 @@session. 属同义。如果变量名前面没有附加的修饰词的话,那么 SET 只修改会话变量。

以 @@var_name这种格式来表示系统变量,在 MySQL 中是可以支持的,以兼容其它数据库系统。

如果你想在同一个语句中来修改多个系统变量,最后一次出现的 GLOBAL 或 SESSION 将作为该语句中没有修饰词的变量的默认选项。

SET sort_buffer_size=10000;

SET @@local.sort_buffer_size=10000;

SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;

SET @@sort_buffer_size=1000000;

SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;

如果你设置了系统变量时用 SESSION (默认的) 选项,那么它的值将在会话结束前或者直到你改变它之前一直有效。如果设置系统变量是用 GLOBAL 选项,这必须要求你具备 SUPER (超级) 权限,它的值从新的连接开始到系统重启前一直有效。如果你想要一个变量永久生效的话,那么可以把它放到配置文件中。详情请看“4.3.2 Using Option Files”。

为了防止操作错误,例如如果你想用 SET GLOBAL 修改一个只能用 SET SESSION 来修改的变量,或者不是用 SET GLOBAL 的方式来修改一个全局变量时, MySQL 就会报告一个错误。

如果你想让一个 SESSION (会话) 变量的值设定成为一个 GLOBAL 变量的值,或者想让 GLOBAL 变量的值变成MySQL内嵌编译的默认值的话,你可以设置它为 DEFAULT (默认值) 。以下的这 2 个例子都是同样的设置会话变量 max_join_size 的值成为全局变量的值:

SET max_join_size=DEFAULT;

SET @@session.max_join_size=@@global.max_join_size;

你可以通过 SHOW VARIABLES 命令列出绝大部分的系统变量。详情请看“14.5.3.20 SHOW VARIABLES Syntax”的语法 。如果想要通过模式匹配的方式来获取变量列表的话,可以使用 LIKE 分句:

SHOW VARIABLES LIKE ‘max_join_size’;

SHOW GLOBAL VARIABLES LIKE ‘max_join_size’;

你还可以使用 SELECT @@[global.|local.]var_name 来取得指定变量的值:

SELECT @@max_join_size, @@global.max_join_size;

在通过 SELECT @@var_name ( 这样的话,就无需指定是 global 还是 session 抑或是 local 了 ) 来取得变量的值时, MySQL 会返回 SESSION 变量的值,如果它不存在,则返回 GLOBAL 变量的值。

以下所列的是那些非标准或者是在章节“5.2.3 Server System Variables”中找没有列出来的变量。尽管这些变量用 SHOW VARIABLES 并不显示出来,但你可以用 SELECT ( CHARACTER SET 和 SET NAMES 除外 ) 来取得它们的值。例如:

mysql> SELECT @@AUTOCOMMIT;

+————–+

| @@autocommit |

+————–+

|            1 |

+————–+

AUTOCOMMIT = {0 | 1}

设置 autocommit (自动提交)模式。若设置为 1 ,则所有对数据表的操作都会立即生效。若设置为 0 ,则必须执行 COMMIT 以提交事务或者执行 ROLLBACK 取消事务。如果把 AUTOCOMMIT 由 0 改成 1 , MySQL 会自动提交任何一个开放的事务。开始一个事务的另一个方法可以是执行 START TRANSACTION 或 BEGIN 语句。详情请看“14.4.1 START TRANSACTION, COMMIT, and ROLLBACK Syntax”。

BIG_TABLES = {0 | 1}

如果被设置为 1,则所有的临时表将存放在磁盘里而非内存。这会使速度变得稍微慢了点,但是在执行 SELECT 操作时需要一个大临时表的情况下就不再会报告 The table tbl_name is full 错误了。对于新连接,它的默认值是 0(在内存中存放临时表) 。从 MySQL 4.0 起,你无需设置这个变量,因为 MySQL 会自动在需要的情况下将内存存储的表转换为硬盘存储的表。这个变量现在的名字是 SQL_BIG_TABLES 。

CHARACTER SET {charset_name | DEFAULT}

它用于将从客户端取得的以及发往客户端的字符串都映射成指定的字符串。在 MySQL 4.1 以前,唯一允许的字符集是 cp1251_koi8 ,不过你也可以通过修改 MySQL 发布的源代码中的 `sql/convert.cc’ 文件来增加新的转换字符集。从 MySQL 4.1.1 开始,SET CHARACTER SET 将设置 3 个会话系统变量: character_set_client 和 character_set_results 会被设置成指定的字符集, character_set_connection 的值被设置成 character_set_database 的值。默认的转换字符集可以被重置为值 DEFAULT (默认值) 。请注意,SET CHARACTER SET 的语法和其它大多数设置选项的语法不一样。

FOREIGN_KEY_CHECKS = {0 | 1}

如果它设置为 1 (默认值) ,则 InnoDB 表都会检查外键约束关系。如果设置为 0 ,则会略过,不做检查。禁止外键约束关系检查在重新加载和实际所要求的父子关系顺序不一致顺序的 InnoDB 表时非常有用。这个变量是在 MySQL 3.23.52 中新增的。详情请看“16.7.4 FOREIGN KEY Constraints”。

IDENTITY = value

这个变量和变量 LAST_INSERT_ID 实际上是一样的。它的存在是为了与其它数据库系统兼容。从 MySQL 3.23.25 开始,可以通过执行 SELECT @@IDENTITY 来获得它的值。从 MySQL 4.0.3 开始,还可以执行 SET IDENTITY 来改变它的值。

INSERT_ID = value

修改它的值可以作为在执行 INSERT 或 ALTER TABLE 语句中要插入一个 AUTO_INCREMENT 值时的下一个值。它主要用于二进制日志(binary log)。

LAST_INSERT_ID = value

修改它的值可以作为 LAST_INSERT_ID() 的返回值。当数据表被更新时它的值会存放在二进制日志中,可以执行 LAST_INSERT_ID() 语句来取得它的值。设置它的值不会改变 C API 函数 mysql_insert_id() 返回的结果值。

NAMES {‘charset_name’ | DEFAULT}

SET NAMES 设置了 3 个会话变量 character_set_client , character_set_connection 和 character_set_results 为指定的字符集。默认的映射关系可以设定为 DEFAULT。请注意, SET NAMES 语法也不同于大多数其它的设置选项。它是自从 MySQL 4.1.0 以后才开始有的。

SQL_AUTO_IS_NULL = {0 | 1}

如果被设置为 1 ( 默认值 ) ,则可以通过以下语句来获得某个包含 AUTO_INCREMENT 类型字段的表最后一条插入的记录:

WHERE auto_increment_column IS NULL

这种做法在某些 ODBC 程序中会被用到,例如 Access 。 SQL_AUTO_IS_NULL 变量是在 MySQL 3.23.52 中新增的。

SQL_BIG_SELECTS = {0 | 1}

如果设置为 0 ,则 MySQL 会放弃那些可能会耗费很长时间(是指那些通过优化程序估计到需要检查的行数会超过 max_join_size 设定值的情况)的 SELECT 语句。这在有不可取的 WHERE 语句出现时十分有用。 每个新连接的 SQL_BIG_SELECTS 默认值为 1 ,以允许执行所有的 SELECT 语句。如果设置系统变量 max_join_size 为非默认值( DEFAULT ),则 SQL_BIG_SELECTS 也会被自动设置成为 0。

SQL_BUFFER_RESULT = {0 | 1}

SQL_BUFFER_RESULT 强制将 SELECT 语句查询的结果放在临时表中。这可以让 MySQL 尽快释放加载表上的锁,同时还有助于改善向客户端发送结果需要较长时间的情况。这个变量是在 MySQL 3.23.13 中新增的。

SQL_LOG_BIN = {0 | 1}

如果设置为 0,就不再记录任何二进制日志了。必须要有 SUPER (超级) 权限方可修改它的值。这个变量是在 MySQL 3.23.13 中新增的。

SQL_LOG_OFF = {0 | 1}

如果设置为 1 ,系统将不记录任何普通的查询日志。必须要有 SUPER (超级) 权限方可修改它的值。

SQL_LOG_UPDATE = {0 | 1}

如果设置为 0 ,更新日志将不记录任何日志。必须要有 SUPER (超级) 权限方可修改它的值。这个变量是在 MySQL 3.22.5 中新增的。从 MySQL 5.0.0 开始,它已经建议不再使用,而变成了 SQL_LOG_BIN ( 详情请看“C.1.3 Changes in release 5.0.0 (22 Dec 2003: Alpha” ) 。

SQL_QUOTE_SHOW_CREATE = {0 | 1}

如果设置为 1 ,则在执行 SHOW CREATE TABLE 时就会把数据表名和字段用引号引起来;如果设置为 0 ,就不再引用了。这个选项默认是打开的,因为在数据库同步时需要所有的表名和字段名都必须引用起来才行。这个选项是在 MySQL 3.23.26 中新增的。详细的请查看“14.5.3.6 SHOW CREATE TABLE Syntax”。

SQL_SAFE_UPDATES = {0 | 1}

如果设置为 1 ,则 MySQL 会放弃那些在 WHERE 或 LIMIT 分句中没有使用键的 UPDATE 或 DELETE 语句。这就可能会捕获那些没有正确使用键并且可能会删除很多记录的 UPDATE 或 DELETE 语句。这个变量是在 MySQL 3.22.32 中新增的。

SQL_SELECT_LIMIT = {value | DEFAULT}

它决定了执行 SELECT 语句时返回的最大记录数。新连接的默认设置值是“ unlimited (无限)”。如果它被改变了,可以设定重新设 SQL_SELECT_LIMIT 的值定为 DEFAULT 以将它恢复为默认值。当 SELECT 语句中有 LIMIT 分句时, LIMIT 优先级高于 SQL_SELECT_LIMIT 的值。

SQL_WARNINGS = {0 | 1}

它决定了在执行单行 INSERT 语句(译者注:一次只有一个 INSERT 语句)发生错误的情况下,是否要报告错误信息。它的默认值是 0 ,如果设置为 1 ,则会在发生错误时报告错误信息。这个变量是在 MySQL 3.22.11 中新增的。

TIMESTAMP = {timestamp_value | DEFAULT}

它可以设定系统时间。它用于取二进制日志用于恢复记录时来取得原始时间戳。timestamp_value 必须是 Unix 时间戳,而不是 MySQL 时间戳。

UNIQUE_CHECKS = {0 | 1}

如果设定为 1 (默认值),就会对 InnoDB 表的第二索引做唯一性检查。如果设置为 0 ,就不再做唯一性检查。这个变量是在 MySQL 3.23.52 中新增的。详情请看“16.7.4 FOREIGN KEY Constraints”。

14.5.3.2 SHOW CHARACTER SET 语法

SHOW CHARACTER SET [LIKE ‘pattern’]

SHOW CHARACTER SET 列出了所有可用的字符集。它有一个可选项是 LIKE 分句以示匹配哪些字符集。例如:

mysql> SHOW CHARACTER SET LIKE ‘latin%’;

+———+—————————–+——————-+——–+

| Charset | Description                 | Default collation | Maxlen |

+———+—————————–+——————-+——–+

| latin1  | ISO 8859-1 West European    | latin1_swedish_ci |      1 |

| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |

| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |

| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |

+———+—————————–+——————-+——–+

Maxlen 字段显示了储存一个字符使用的最大字节数。

SHOW CHARACTER SET 是在 MySQL 4.1.0 中新增的。

14.5.3.3 SHOW COLLATION 语法

SHOW COLLATION [LIKE ‘pattern’]

SHOW COLLATION 的结果包括了所有可用的字符集。它有一个可选项是 LIKE 分句以示匹配哪些校对。例如:

mysql> SHOW COLLATION LIKE ‘latin1%’;

+——————-+———+—-+———+———-+———+

| Collation         | Charset | Id | Default | Compiled | Sortlen |

+——————-+———+—-+———+———-+———+

| latin1_german1_ci | latin1  |  5 |         |          |       0 |

| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       0 |

| latin1_danish_ci  | latin1  | 15 |         |          |       0 |

| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |

| latin1_bin        | latin1  | 47 |         | Yes      |       0 |

| latin1_general_ci | latin1  | 48 |         |          |       0 |

| latin1_general_cs | latin1  | 49 |         |          |       0 |

| latin1_spanish_ci | latin1  | 94 |         |          |       0 |

+——————-+———+—-+———+———-+———+

Default 字段表示其是否为该字符集的默认校对。Compiled 字段表示该校对是否预编译到服务器中了。Sortlen 字段表示需要多少内存用来对字符集中的字符串表示进行排序。

SHOW COLLATION 是在 MySQL 4.1.0 中新增的。

14.5.3.4 SHOW COLUMNS 语法

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE ‘pattern’]

SHOW COLUMNS 列出了给定表的所有字段。请注意,如果看到的字段类型和你以前用 CREATE TABLE 创建的字段类型不同的话,可能是 MySQL 有时候会在创建或修改表结构时修改字段类型。什么情况下 MySQL 会改变字段类型详情请看“14.2.6.1 Silent Column Specification Changes”。

从 MySQL 3.23.32 开始,就可以使用关键字 FULL 了。它使得输出的结果包括了当前用户对每个字段所具备的权限。从 MySQL 4.1 开始,关键字 FULL 也会令每个字段的注释显示出来。

还可以选择是否使用 db_name.tbl_name 的语法格式。以下的这2个语句是一样的:

mysql> SHOW COLUMNS FROM mytable FROM mydb;

mysql> SHOW COLUMNS FROM mydb.mytable;

SHOW FIELDS 和 SHOW COLUMNS 是一样的。同时还可以通过命令 mysqlshow db_name tbl_name 来列出所有的字段。

DESCRIBE 语句和 SHOW COLUMNS 显示的结果信息类似。详情请看“14.3.1 DESCRIBE Syntax (Get Information About Columns)”。

14.5.3.5 SHOW CREATE DATABASE 语法

SHOW CREATE DATABASE db_name

根据给定的数据库显示一个完整的 CREATE DATABASE 语句。它是在 MySQL 4.1 中新增的。

mysql> SHOW CREATE DATABASE test\G

*************************** 1. row ***************************

       Database: test

Create Database: CREATE DATABASE `test`

                 /*!40100 DEFAULT CHARACTER SET latin1 */

14.5.3.6 SHOW CREATE TABLE 语法

SHOW CREATE TABLE tbl_name

根据给定的数据表显示一个完整的 CREATE TABLE 语句。它是在 MySQL 3.23.20 中新增的。

mysql> SHOW CREATE TABLE t\G

*************************** 1. row ***************************

       Table: t

Create Table: CREATE TABLE t (

  id INT(11) default NULL auto_increment,

  s char(60) default NULL,

  PRIMARY KEY (id)

) TYPE=MyISAM default charset utf8

SHOW CREATE TABLE 根据参数 SQL_QUOTE_SHOW_CREATE 的值来决定是否要把表名和字段名用引号引用起来。详情请看“14.5.3.1 SET Syntax”。

14.5.3.7 SHOW CREATE VIEW 语法

SHOW CREATE VIEW view_name

根据给定的试图名显示一个完整的 CREATE VIEW 语句。它是在 MySQL 5.0.1 中新增的。

mysql> SHOW CREATE VIEW v;

+——-+—————————————————-+

| Table | Create Table                                       |

+——-+—————————————————-+

| v     | CREATE VIEW `test`.`v` AS select 1 AS `a`,2 AS `b` |

+——-+—————————————————-+

这个语法是在 MySQL 5.0.1 加上的。

14.5.3.8 SHOW DATABASES 语法

SHOW DATABASES [LIKE ‘pattern’]

SHOW DATABASES 列出了 MySQL 服务器上所有的数据库,通过 mysqlshow 命令也可以得到同样的结果。从 MySQL 4.0.2 开始,如果没有全局的 mysqlshow 权限的话,就只能列出那些有相关权限的数据库了。

如果服务器启动时增加参数 –skip-show-database,并且你没有 SHOW DATABASES 权限的话,就无法通过这个语句来列出数据库了。

14.5.3.9 SHOW ENGINES 语法

SHOW [STORAGE] ENGINES

SHOW ENGINES 显示了存储引擎相关的状态信息。这对检查是否支持某种存储引擎或者什么存储引擎是默认的非常有用。这个语句是在 MySQL 4.1.2 实现的。SHOW TABLE TYPES 跟它一样,但是不推荐使用。

mysql> SHOW ENGINES\G

*************************** 1. row ***************************

Engine: MyISAM

Support: DEFAULT

Comment: Default engine as of MySQL 3.23 with great performance

*************************** 2. row ***************************

Engine: HEAP

Support: YES

Comment: Alias for MEMORY

*************************** 3. row ***************************

Engine: MEMORY

Support: YES

Comment: Hash based, stored in memory, useful for temporary tables

*************************** 4. row ***************************

Engine: MERGE

Support: YES

Comment: Collection of identical MyISAM tables

*************************** 5. row ***************************

Engine: MRG_MYISAM

Support: YES

Comment: Alias for MERGE

*************************** 6. row ***************************

Engine: ISAM

Support: NO

Comment: Obsolete storage engine, now replaced by MyISAM

*************************** 7. row ***************************

Engine: MRG_ISAM

Support: NO

Comment: Obsolete storage engine, now replaced by MERGE

*************************** 8. row ***************************

Engine: InnoDB

Support: YES

Comment: Supports transactions, row-level locking, and foreign keys

*************************** 9. row ***************************

Engine: INNOBASE

Support: YES

Comment: Alias for INNODB

*************************** 10. row ***************************

Engine: BDB

Support: YES

Comment: Supports transactions and page-level locking

*************************** 11. row ***************************

Engine: BERKELEYDB

Support: YES

Comment: Alias for BDB

*************************** 12. row ***************************

Engine: NDBCLUSTER

Support: YES

Comment: Clustered, fault-tolerant, memory-based tables

*************************** 13. row ***************************

Engine: NDB

Support: YES

Comment: Alias for NDBCLUSTER

*************************** 14. row ***************************

Engine: EXAMPLE

Support: YES

Comment: Example storage engine

*************************** 15. row ***************************

Engine: ARCHIVE

Support: YES

Comment: Archive storage engine

Support 字段的值表明是否支持什么存储引擎和哪种存储引擎是默认的。例如,如果服务器启动时增加参数 –default-table-type=InnoDB,那么 InnoDB 这行的 Support 字段的值就是 DEFAULT 。

14.5.3.10 SHOW ERRORS 语法

SHOW ERRORS [LIMIT [offset,] row_count]

SHOW COUNT(*) ERRORS

这个语句跟 SHOW WARNINGS 类似,不同之处是 SHOW WARNINGS 同时显示了错误,警告以及注意,而它却只显示错误信息。SHOW ERRORS 是从 MySQL 4.1.0 开始有的。

LIMIT 分句和的 SELECT 语法一样,详情请看“14.1.7 SELECT Syntax”。

SHOW COUNT(*) ERRORS 语句显示了错误信息的总记录数。也可以通过取得变量 error_count 的值来获得总错误记录数:

SHOW COUNT(*) ERRORS;

SELECT @@error_count;

详情请看“14.5.3.21 SHOW WARNINGS Syntax”。

14.5.3.11 SHOW GRANTS 语法

SHOW GRANTS FOR user

该语句列出了某个 MySQL 帐户用 GRANT 语句授权的全部权限。

mysql> SHOW GRANTS FOR ‘root’@’localhost’;

+———————————————————————+

| Grants for root@localhost                                           |

+———————————————————————+

| GRANT ALL PRIVILEGES ON *.* TO ‘root’@’localhost’ WITH GRANT OPTION |

+———————————————————————+

从 MySQL 4.1.2 开始,也可以使用以下几个语句之一来列出当前会话具备的权限:

SHOW GRANTS;

SHOW GRANTS FOR CURRENT_USER;

SHOW GRANTS FOR CURRENT_USER();

在 MySQL 4.1.2 以前,可以通过函数 CURRENT_USER() (MySQL 4.0.6 新增的 ) 的值来知道当前会话授权给哪个用户,并且把它的值用于 SHOW GRANTS 语句中。详情请看“13.8.3 Information Functions”。

SHOW GRANTS 是在 MySQL 3.23.4 中新增的。

14.5.3.12 SHOW INDEX 语法

SHOW INDEX FROM tbl_name [FROM db_name]

SHOW INDEX 很像 ODBC 的 SQLStatistics 调用,它按照一定的格式返回数据表的索引信息。

SHOW INDEX 返回以下字段:

Table

表名。

Non_unique

0 表示该索引不能有重复的记录,反之则反。

Key_name

索引名。

Seq_in_index

该字段在索引中的次序,从 1 开始。

Column_name

字段名。

Collation

字段在索引中是怎么排序的。在 MySQL 中,它的值可以是 `A’ ( 升序 ) 或 NULL ( 无序 ) 。

Cardinality

该索引中唯一值的数量,当执行 ANALYZE TABLE 或 myisamchk -a. Cardinality 时会更新它的值。 Cardinality (基数) 是用整数存储的基于统计的结果,因此如果是小表,那么它的结果可能未必精确。基数越大,则 MySQL 在做表连接时使用索引的几率越大。

Sub_part

它表示某个字段对多长的字符做索引。当整个字段都做索引了,那么它的值是 NULL。

Packed

表示键值是如何压缩的,NULL 表示没有压缩。

Null

当字段包括 NULL 的记录是 YES,它的值为,反之则是 ”。

Index_type

使用了哪种索引算法(有BTREE, FULLTEXT, HASH, RTREE)。

Comment

各种不同的备注。在MySQL 4.0.2以前,如果增加了 Index_type 字段,则 Comment 字段用户表示该索引是为 FULLTEXT 索引。

字段 Packed 和 Comment 是在MySQL 3.23.0中新增的。而 Null 和 Index_type是在MySQL 4.0.2中新增的。

在 tbl_name FROM db_name 语法中,还可以选择是否使用 db_name.tbl_name 的格式。以下的这2个语句是一样的:

mysql> SHOW INDEX FROM mytable FROM mydb;

mysql> SHOW INDEX FROM mydb.mytable;

SHOW KEYS 和 SHOW INDEX 是一样的,也可以通过执行 mysqlshow -k db_name tbl_name 命令来列出数据表的索引信息。

14.5.3.13 SHOW INNODB STATUS 语法

SHOW INNODB STATUS

它显示了 InnoDB 存储引擎状态的其他的扩展信息。

14.5.3.14 SHOW LOGS 语法

SHOW [BDB] LOGS

SHOW LOGS 显示了现存的日志文件的状态。它是在MySQL 3.23.29中实现的。现在它只显示了Berkeley DB类型的日志文件,因此它的另一个用法是SHOW LOGS(从MySQL 4.1.1开始)。

SHOW LOGS 返回了以下几个字段:

File

日志文件的完整路径。

Type

日志文件的类型(例如:BDB 表示Berkeley DB类型的日志文件)。

Status

文件状态(FREE 表示文件可以删除,IN USE 表示在事务子系统中需要用到该日志文件)。

14.5.3.15 SHOW PRIVILEGES 语法

SHOW PRIVILEGES

SHOW PRIVILEGES 列出了所有MySQL基本服务器所支持的权限。它是在MySQL 4.1.0中实现的。

mysql> SHOW PRIVILEGES\G

*************************** 1. row ***************************

Privilege: Select

  Context: Tables

  Comment: To retrieve rows from table

*************************** 2. row ***************************

Privilege: Insert

  Context: Tables

  Comment: To insert data into tables

*************************** 3. row ***************************

Privilege: Update

  Context: Tables

  Comment: To update existing rows

*************************** 4. row ***************************

Privilege: Delete

  Context: Tables

  Comment: To delete existing rows

*************************** 5. row ***************************

Privilege: Index

  Context: Tables

  Comment: To create or drop indexes

*************************** 6. row ***************************

Privilege: Alter

  Context: Tables

  Comment: To alter the table

*************************** 7. row ***************************

Privilege: Create

  Context: Databases,Tables,Indexes

  Comment: To create new databases and tables

*************************** 8. row ***************************

Privilege: Drop

  Context: Databases,Tables

  Comment: To drop databases and tables

*************************** 9. row ***************************

Privilege: Grant

  Context: Databases,Tables

  Comment: To give to other users those privileges you possess

*************************** 10. row ***************************

Privilege: References

  Context: Databases,Tables

  Comment: To have references on tables

*************************** 11. row ***************************

Privilege: Reload

  Context: Server Admin

  Comment: To reload or refresh tables, logs and privileges

*************************** 12. row ***************************

Privilege: Shutdown

  Context: Server Admin

  Comment: To shutdown the server

*************************** 13. row ***************************

Privilege: Process

  Context: Server Admin

  Comment: To view the plain text of currently executing queries

*************************** 14. row ***************************

Privilege: File

  Context: File access on server

  Comment: To read and write files on the server

14.5.3.16 SHOW PROCESSLIST 语法

SHOW [FULL] PROCESSLIST

SHOW PROCESSLIST 显示了有哪些线程在运行。也可以执行 mysqladmin processlist 命令来得到这些信息。如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。详情请看“14.5.4.3 KILL Syntax”。如果没有使用关键字 FULL,则只能看到每个查询的前100个字符。

从MySQL 4.0.12起,结果中还会以的 host_name:client_port 格式来显示通过TCP/IP方式连接过来的客户端的主机名,这就可以知道每个客户端都正在做什么。

这个语句在出现“too many connections”错误时想看看都正在执行什么查询非常有用。MySQL为拥有 SUPER 权限的账户保留了一个额外的连接,这就保证让管理员总是可以连上检查系统状况(假定没有给每个系统账户都授予这个权限)。

SHOW PROCESSLIST 结果中一些常见的状态如下:

Checking table

正在检查数据表(这是自动的)。

Closing tables

正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。

Connect Out

同步从服务器正在连接主服务器。

Copying to tmp table on disk

由于临时结果集大于 tmp_table_size,正在将临时表从内存存储转为磁盘存储以节省内存。

Creating tmp table

正在创建临时表以存放部分查询结果。

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

服务器正在执行多表删除中的第二部分,正在删除其他表的记录。

Flushing tables

正在执行 FLUSH TABLES,等待其他线程关闭数据表。

Killed

发送了一个 kill 请求给某线程,那么这个线程将会检查 kill 标志位,同时会放弃下一个 kill 请求。MySQL会在每次的主循环中检查 kill 标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么 kill 请求会在锁释放时马上生效。

Locked

被其他查询锁住了。

Sending data

正在处理 SELECT 查询的记录,同时正在把结果发送给客户端。

Sorting for group

正在为 GROUP BY 做排序。

Sorting for order

正在为 ORDER BY 做排序。

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。例如,在执 ALTER TABLE 或 LOCK TABLE 语句行完以前,数据表无法被其他线程打开。 正尝试打开一个表。

Removing duplicates

正在执行一个 SELECT DISTINCT 方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后把结果发送给客户端。

Reopen table

获得对一个表的锁,但是被通知到得到锁之后该表结构会发生变化。因此就先释放锁,关闭表,重新打开它

Repair by sorting

修复指令正在用排序算法创建索引。

Repair with keycache

修复指令正在利用索引缓存一个个地创建新索引。它会比 Repair by sorting 慢很多。

Searching rows for update

正在将符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部系统锁。如果当前没有需要运行多个 mysqld 服务器同时来请求同一个表,那么可以通过增加 –skip-external-locking 参数来禁止外部系统锁。

Upgrading lock

INSERT DELAYED 处理程序正在尝试取得一个锁表以插入新记录。

Updating

正在搜索需要更新的记录,并正在更新。

User Lock

正在等待 GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE。

waiting for handler insert

INSERT DELAYED 已经处理完了所有待处理的插入操作,正在等待新的请求。

大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否产生错误了时才用得着。

14.5.3.17 SHOW STATUS 语法

SHOW STATUS [LIKE ‘pattern’]

SHOW STATUS 显示了各种服务器状态信息。也可以通过运行 mysqladmin extended-status 命令来得到结果。

这里有部分输出结果,某些变量和它对应的值可能跟你的系统不大一样。各种变量所代表的意义详情请看“5.2.4 Server Status Variables”。

mysql> SHOW STATUS;

+————————–+————+

| Variable_name            | Value      |

+————————–+————+

| Aborted_clients          | 0          |

| Aborted_connects         | 0          |

| Bytes_received           | 155372598  |

| Bytes_sent               | 1176560426 |

| Connections              | 30023      |

| Created_tmp_disk_tables  | 0          |

| Created_tmp_tables       | 8340       |

| Created_tmp_files        | 60         |



| Open_tables              | 1          |

| Open_files               | 2          |

| Open_streams             | 0          |

| Opened_tables            | 44600      |

| Questions                | 2026873    |



| Table_locks_immediate    | 1920382    |

| Table_locks_waited       | 0          |

| Threads_cached           | 0          |

| Threads_created          | 30022      |

| Threads_connected        | 1          |

| Threads_running          | 1          |

| Uptime                   | 80380      |

+————————–+————+

可以通过 LIKE 分句,就可以值显示匹配的变量及其值:

mysql> SHOW STATUS LIKE ‘Key%’;

+——————–+———-+

| Variable_name      | Value    |

+——————–+———-+

| Key_blocks_used    | 14955    |

| Key_read_requests  | 96854827 |

| Key_reads          | 162040   |

| Key_write_requests | 7589728  |

| Key_writes         | 3813196  |

+——————–+———-+

14.5.3.18 SHOW TABLE STATUS 语法

SHOW TABLE STATUS [FROM db_name] [LIKE ‘pattern’]

SHOW TABLE STATUS(在MySQL 3.23新增的)跟 SHOW TABLE 类似,它还显示每个表的许多相关信息。也可以通过运行 mysqlshow –status db_name 命令来显示同样的结果。

SHOW TABLE STATUS 返回了以下几个字段的信息:

Name

表名。

Engine

数据表的存储引擎类型,在MySQL 4.1.2以前,这个值被标志为 Type。详情请看“15 MySQL Storage Engines and Table Types”。

Version

数据表的 `.frm’ 文件版本号。

Row_format

记录存储格式(Fixed—固定的, Dynamic—动态的, 或 Compressed—压缩的)。

Rows

记录数。在某些存储引擎中,例如MyISAM 和 ISAM 他们存储了精确的记录数。不过其他存储引擎中,例如 InnoDB,它可能只是近似值。

Avg_row_length

记录的平均长度。

Data_length

数据文件长度。

Max_data_length

数据文件的最大长度。对固定格式存储记录的表来说,它是表的最大记录数。对动态存储记录的表来说,它是数据表存储的最大字节数,给出了数据指针使用的大小。

Index_length

索引文件的长度。

Data_free

已经分配还未使用的字节数。

Auto_increment

下一个 AUTO_INCREMENT 的值。

Create_time

表的创建时间。

Update_time

表最后一次更新时间。

Check_time

表最后一次检查时间。

Collation

表的字符集和校正字符集(在中MySQL4.1.1新增的)。

Checksum

实时的校验和值(如果有的话) (在中MySQL4.1.1新增的)。

Create_options

额外留给 CREATE TABLE 的选项。

Comment

创建表时的备注(或者一些MySQL无法存取改表的相关信息)。

表注释一栏,InnoDB 类型的表会报告它所属的表剩余表空间。对一个使用共享表空间的表来说,它是指共享表空间的剩余空间。如果使用多表空间并且该表有自己的表空间,那么剩余空间就是全部属于这个表的。

对 MEMORY (HEAP) (内存)表来说,Data_length, Max_data_length, 和 Index_length 的值接近内存实际分配结果。分配算法预留了大量内存空间以减少重复分配内存的操作。

14.5.3.19 SHOW TABLES 语法

SHOW [OPEN] TABLES [FROM db_name] [LIKE ‘pattern’]

SHOW TABLES 列出了给定数据库中的非临时(non-TEMPORARY)表。也可以通过命令 mysqlshow db_name 来列出这些表。

在MySQL 5.0.1以前,SHOW TABLES 的结果中只有一个字段显示表名。从MySQL 5.0.1开始,SHOW TABLES 还列出了数据库中的视图,还有第二个字段。第二字段的值是表的 BASE TABLE (基表)或者视图名。

请注意,如果没有表的相应权限,那么在 SHOW TABLES 或 mysqlshow db_name 结果中就不会列出该表。

SHOW OPEN TABLES 列出了所有当前正被打开的表。详情请看“7.4.8 How MySQL Opens and Closes Tables”。显示结果中的 Comment 字段告诉我们该表被 cached 和 in_use 的时间。从MySQL 3.23.33开始,可以使用 OPEN 关键字。

14.5.3.20 SHOW VARIABLES语法

SHOW [GLOBAL | SESSION] VARIABLES [LIKE ‘pattern’]

SHOW VARIABLES 显示了一些MySQL的系统变量值。这些信息也可以通过运行命令 mysqladmin variables 来得到。

GLOBAL 和 SESSION 可选项是从MySQL 4.0.3开始可以用的。如果是 SESSION,就会得到每次新连接中使用的变量值。如果是

SESSION,则得到当前连接中变量的值。如果你不加任何选选项,那么 SESSION 就是默认的。LOCAL 和 SESSION 一样。

如果变量的默认值不大合适,则可以在 mysqld 启动时通过命令行增加相关选项或者通过 SET 语句来做到。详情请看“5.2.1 mysqld Command-Line Options”和“14.5.3.1 SET Syntax. ”。

以下列出了部分结果,这些结果值可能与您的系统的值不一样。每个变量的值对应的意义详情请看“5.2.3 Server System Variables”。如何协调这些变量详情请看“7.5.2 Tuning Server Parameters”。

mysql> SHOW VARIABLES;

+———————————+——————————+

| Variable_name                   | Value                        |

+———————————+——————————|

| back_log                        | 50                           |

| basedir                         | /usr/local/mysql             |

| bdb_cache_size                  | 8388572                      |

| bdb_log_buffer_size             | 32768                        |

| bdb_home                        | /usr/local/mysql             |



| max_connections                 | 100                          |

| max_connect_errors              | 10                           |

| max_delayed_threads             | 20                           |

| max_error_count                 | 64                           |

| max_heap_table_size             | 16777216                     |

| max_join_size                   | 4294967295                   |

| max_relay_log_size              | 0                            |

| max_sort_length                 | 1024                         |



| timezone                        | EEST                         |

| tmp_table_size                  | 33554432                     |

| tmpdir                          | /tmp/:/mnt/hd2/tmp/          |

| version                         | 4.0.4-beta                   |

| wait_timeout                    | 28800                        |

+———————————+——————————+

可以使用 LIKE 分句列出匹配的变量:

mysql> SHOW VARIABLES LIKE ‘have%’;

+——————–+———-+

| Variable_name      | Value    |

+——————–+———-+

| have_bdb           | YES      |

| have_innodb        | YES      |

| have_isam          | YES      |

| have_raid          | NO       |

| have_symlink       | DISABLED |

| have_openssl       | YES      |

| have_query_cache   | YES      |

+——————–+———-+

14.5.3.21 SHOW WARNINGS 语法

SHOW WARNINGS [LIMIT [offset,] row_count]

SHOW COUNT(*) WARNINGS

SHOW WARNINGS 显示了最后一个查询语句产生的错误、警告、提示等信息,如果它没有产生任何信息,则不显示任何信息。这个语句是在MySQL 4.1.0实现的。它的一个相关语句是 SHOW ERRORS,不过它只显示错误信息,详情请看“14.5.3.10SHOW ERRORS Syntax”。

随着执行语句的不同每次显示的信息都会产生变化。

SHOW COUNT(*) WARNINGS 语句显示了错误、警告、提示信息的总记录数。也可以通过取得变量 warning_count 的值来获得总错误记录数:

SHOW COUNT(*) WARNINGS;

SELECT @@warning_count;

warning_count 的值可能会比 SHOW WARNINGS 显示的结果记录数大,因为系统变量 max_error_count 被设置的比较小,因此没有把所有的信息都存下来。本章节后面演示了发生这种情况的例子。

LIMIT 分句的用法和在 SELECT 语句一样。详情请看“14.1.7 SELECT Syntax”。

MySQL服务器把最后一次查询中产生的错误、警告、提示信息总数返回了。如果使用C API,这个值可以通过调用 mysql_warning_count() 得到。详情请看“21.2.3.58 mysql_warning_count()”。

注意,警告信息的框架在MySQL 4.1.0中增加了,在这个时候还有很多语句不产生警告信息。在4.1.1中,这种情况得到了改善,很多语句都产生了警告信息,例如:LOAD DATA INFILE 及 INSERT, UPDATE, CREATE TABLE, 和 ALTER TABLE 等。

以下 DROP TABLE 语句就产生了一个提示信息:

mysql> DROP TABLE IF EXISTS no_such_table;

mysql> SHOW WARNINGS;

+——-+——+——————————-+

| Level | Code | Message                       |

+——-+——+——————————-+

| Note  | 1051 | Unknown table ‘no_such_table’ |

+——-+——+——————————-+

以下是一个 CREATE TABLE 和 INSERT 语句产生的语法警告和转换警告信息:

mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4)) TYPE=MyISAM default charset utf8 ;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G

*************************** 1. row ***************************

  Level: Warning

   Code: 1287

Message: ‘TYPE=storage_engine’ is deprecated, use

         ‘ENGINE=storage_engine’ instead

1 row in set (0.00 sec)

mysql> INSERT INTO t1 VALUES(10,’mysql’),(NULL,’test’),

    -> (300,’open source’);

Query OK, 3 rows affected, 4 warnings (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 4

mysql> SHOW WARNINGS\G

*************************** 1. row ***************************

  Level: Warning

   Code: 1265

Message: Data truncated for column ‘b’ at row 1

*************************** 2. row ***************************

  Level: Warning

   Code: 1263

Message: Data truncated, NULL supplied to NOT NULL column ‘a’ at row 2

*************************** 3. row ***************************

  Level: Warning

   Code: 1264

Message: Data truncated, out of range for column ‘a’ at row 3

*************************** 4. row ***************************

  Level: Warning

   Code: 1265

Message: Data truncated for column ‘b’ at row 3

4 rows in set (0.00 sec)

错误、警告、提示信息的最大存储数量是由系统变量 max_error_count 控制的。它的默认值是64,通过修改 max_error_count 的值就可以改变最大存储数量。以下例子中,ALTER TABLE 语句产生了3个警告信息,不过只存储了1条,因为 max_error_count 的值为 1:

mysql> SHOW VARIABLES LIKE ‘max_error_count’;

+—————–+——-+

| Variable_name   | Value |

+—————–+——-+

| max_error_count | 64    |

+—————–+——-+

1 row in set (0.00 sec)

mysql> SET max_error_count=1;

Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t1 MODIFY b CHAR;

Query OK, 3 rows affected, 3 warnings (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 3

mysql> SELECT @@warning_count;

+—————–+

| @@warning_count |

+—————–+

|               3 |

+—————–+

1 row in set (0.01 sec)

mysql> SHOW WARNINGS;

+———+——+—————————————-+

| Level   | Code | Message                                |

+———+——+—————————————-+

| Warning | 1263 | Data truncated for column ‘b’ at row 1 |

+———+——+—————————————-+

1 row in set (0.00 sec)

想要禁止警告信息,只要将 max_error_count 设置为 0。在这种情况下,warning_count 仍然是产生的警告信息总数,但不存储任何警告信息。

使用phpsql2005数据迁移

为了要 将原有的sql 2005 数据库迁移到 mysql里面……忙活了一整天。

本來使用php的 mssql函數 报错:

function.mssql-connect]: Unable to connect to server

打开phpinfo 查看 发现 mssql 的lib版本还是7.0 于是google找ntwdblib.dll的新版本……

但是找不到ntwdblib.dll 文件的sql2005版本

后来用到了 微软为php开发的php 驱动(SQL Server Driver for PHP) ,msdn的地址:http://msdn.microsoft.com/en-us/library/cc296175(SQL.90).aspx

安裝成php的扩展以后,一切正常,使用sqlsrv_connect 链接数据库一切正常。但马上就遇到了灵异现象。 数据库一直报错

超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Pro……

附件是微软的SQL Server Driver for PHP 安装成php扩展

Preparement方法问题

Oracle开发中进行数据插入的操作,代码是可以完全执行的,到了Mysql方法下 ,却报插入失败的操作。具体报错信息如下:

java.sql.SQLException: Unable to retrieve metadata for procedure.

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)

at com.mysql.jdbc.CallableStatement.extractProcedureName(CallableStatement.java:857)

at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:692)

at com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)

at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4520)

at com.mysql.jdbc.Connection.prepareCall(Connection.java:4594)

at com.mysql.jdbc.Connection.prepareCall(Connection.java:4568)

at com.caucho.sql.UserConnection.prepareCall(UserConnection.java:427)

at com.whir.cms.prjs.chaoHuGov.lwzzMessage.LWMessageServiceImpl.addRecordMessage(LWMessageServiceImpl.java:90)

at _jsp._lwzt._index__jsp._jspService(_index__jsp.java:1048)

at com.caucho.jsp.JavaPage.service(JavaPage.java:61)

at com.caucho.jsp.Page.pageservice(Page.java:578)

at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:195)

at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:148)

at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)

at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)

at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:273)

at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682)

at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:743)

at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:662)

at java.lang.Thread.run(Thread.java:595)

不能够为存储过程找到元数据!的错误信息。

开始以为调用

PreparementStatement的时候 参数设置的有问题。后来经过试验才发现是因为PreparementStatement方法调用的时候发生了错误。

具体方法如下:

开始调用的Connection接口的方法:

PreparedStatement pstmt = this.connection.prepareCall(sql.toString());

改正后调用接口的方法:

PreparedStatement pstmt = this.connection.prepareStatement(sql.toString());

总结1

prepareCall:创建一个 CallableStatement 对象来调用数据库存储过程

prepareStatement:创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库

总结2

pstmt.setString()

可以设置所有类型的参数。不至于类型转换的时候报错。

总结3

想了下 Mysql是不带Procedure的,不支持存储过程,所以用CallableStatement就会报错了。但是OracleCallableStatement调用没有报错。

而且注意一点:CallableStatementPrepareStatement的子接口。

MySQL常见错误

以下文章摘自网络仅备不时之需而已

 

130 :文件格式不正确。(还不是很清楚错误的状况)

 

145 :文件无法打开。

 

1005:MYSQL创建表失败

1006:MYSQL创建数据库失败

1007:MYSQL数据库已存在,创建数据库失败

1008:MYSQL数据库不存在,删除数据库失败

1009:MYSQL不能删除数据库文件导致删除数据库失败

1010:MYSQL不能删除数据目录导致删除数据库失败

1011:MYSQL删除数据库文件失败

1012:MYSQL不能读取系统表中的记录

 

1016:文件无法打开,使用后台修复或者使用 phpmyadmin 进行修复。


Quote:
开始=>所有程序=>附件=>命令提示符
输入 mysql 所在硬盘盘符
cd mysql 所在目录
cd bin
输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI
ps : D:usr/local/mysql/data/bbs 是你论坛数据库的路径
-f 根据具体情况选择,一般也可以选择 -r
注意你的 系统C盘或放数据库的硬盘空间是否足够,一般小于 1G 很容易出现错误。
或用mysqlcheck命令进行修复。具体的方法:利用命令行进入mysql/bin目录,执行
mysqlcheck -o -r phpwind -uroot -p
其中phpwind是你数据库的名称,root是你的数据库用户名,然后会提示你输入密码。然后就会修
复你的数据库。

 

1017:服务器非法关机,导致该文件损坏。

 

1020:MYSQL记录已被其他用户修改

1021:硬盘剩余空间不足,请加大硬盘可用空间

1022:MYSQL关键字重复,更改记录失败

1023:MYSQL关闭时发生错误

1024:MYSQL读文件错误

1025:MYSQL更改名字时发生错误

1026:MYSQL写文件错误

1030:可能是服务器不稳定。(具体原因不是很清楚)

 

1032:MYSQL记录不存在

1036:MYSQL数据表是只读的,不能对它进行修改

1037:系统内存不足,请重启数据库或重启服务器

1038:MYSQL用于排序的内存不足,请增大排序缓冲区

1040:MYSQL已到达数据库的最大连接数,请加大数据库可用连接数


Quote:
在my.ini 修改max_connections=100为max_connections=1000或更大,重启mysql

1041:系统内存不足

1042:无效的主机名

1043:无效连接

1044:MYSQL当前用户没有访问数据库的权限

1045:MYSQL不能连接数据库,服务器、数据库名、用户名或密码错误

Quote:
方法:确保论坛data目录下的sql_config.php用户名与密码都正确.如果用户忘记了数据库的密码,
可以按如下方式进行密码的修改:
如果 MySQL 正在运行,首先停止。
启动 MySQL :bin/safe_mysqld –skip-grant-tables &
就可以不需要密码就进入 MySQL 了。
然后就是
>use mysql
>update user set password=password(“new_pass”) where user=”root”;
>flush privileges;

 

1046:没有选择数据库。

 

1048:MYSQL字段不能为空

1049:MYSQL数据库不存在

1050:MYSQL数据表已存在

1051:MYSQL数据表不存在

1054:MYSQL字段不存在,自行建立字段

 

1060:字段重复,导致无法插入这个字段。

 

1062:字段值重复,入库失败

Quote:
1.如果出类似主码为”65535″的错误,可以查看相关表的自增字段,将字段值改在就可以
2.确保相关数据表中主码重复的字段是否存在,如果存在删除这条记录
3.备份数据库,修复相关表(注:这种情况比较常见,如pw_posts表,对表进行修复的时候不要忘记备份).

 

1064:MySQL 不支持错误提示中的编码。

 

1065:MYSQL无效的SQL语句,SQL语句为空

 

1067:MySQL 版本为 5,不支持空的默认值。

 

1081:MYSQL不能建立Socket连接

1114:MYSQL数据表已满,不能容纳任何记录

1116:MYSQL打开的数据表太多

1129:MYSQL数据库出现异常,请重启数据库

1130:MYSQL连接数据库失败,没有连接数据库的权限

1133:MYSQL数据库用户不存在

 

1135:可能是内存不足够,请联系空间商解决。

 

1141:MYSQL当前用户无权访问数据库

1142:MYSQL当前用户无权访问数据表

1143:MYSQL当前用户无权访问数据表中的字段

1146:MYSQL数据表不存在或数据表缺失,请恢复备份数据

1147:MYSQL未定义用户对数据表的访问权限

1149:MYSQL语句语法错误

1158:网络错误,出现读错误,请检查网络连接状况

1159:网络错误,读超时,请检查网络连接状况

1160:网络错误,出现写错误,请检查网络连接状况

1161:网络错误,写超时,请检查网络连接状况

1062:MYSQL字段值重复,入库失败

1169:MYSQL字段值重复,更新记录失败

1177:MYSQL打开数据表失败

1180:MYSQL提交事务失败

1181:MYSQL回滚事务失败

1203:MYSQL当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或
重启数据库

1205:MYSQL加锁超时

1211:MYSQL当前用户没有创建用户的权限

1216:MYSQL外键约束检查失败,更新子表记录失败

1217:MYSQL外键约束检查失败,删除或修改主表记录失败

1226:MYSQL当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器

1227:MYSQL权限不足,您无权进行此操作

1235:MySQL版本过低,不具有本功能

 

1250:客户端不支持服务器要求的认证协议,请考虑升级客户端。

 

1251:Client 不能支持 authentication protocol 的要求
Client does not support authentication protocol requested by server; consider upgrading MySQL client

Quote:
方法1:
mysql> SET PASSWORD FOR
-> ‘ some_user
‘@’ some_host ‘ = OLD_PASSWORD(‘ newpwd ‘);
结合我们的实际情况,在 MySQL Command Line Client 下运行:
set password for
root@localhost = old_password(‘123456’);

方法2:
       mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘newpwd’)
        -> WHERE Host = ‘some_host’ AND User = ‘some_user’;
       mysql> FLUSH PRIVILEGES;
<上面的部分请按自己实际情况修改。>

 

1267:不合法的混合字符集。

 

2002:服务器端口不对,请咨询空间商正确的端口。

 

2003:MySQL 服务没有启动,请启动该服务。

 

2006:使用mysql做数据库还原的时候,由于有些数据很大,会出现这样的错误:The MySQL Server returned this Error:MySQL Error Nr.2006-MySQL server has gone away。我的一个150mb的备份还原的时候就出现了这错误。解决的方法就是找到mysql安装目录,找到my.ini文件,在文件的最后添加:max_allowed_packet = 10M(也可以设置自己需要的大小)。 max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。

2008:MySQL client ran out of memory
错误指向了MySQL客户mysql。这个错误的原因很简单,客户没有足够的内存存储全部结果。

 

2013:远程连接数据库是有时会有这个问题,MySQL 服务器在执行一条 SQL 语句的时候
失去了连接造成的。

 

10048:最大连接数等问题

Quote:
建议在my.ini文件中修改最大连接数,
把 mysql_connect() 方法都改成了 mysql_pconnect() 方法.
要修改mysql_pconnect(),可以在论坛的data目录的sql_config.php中
$pconnect = 0; //是否持久连接
修改成$pconnect = 1;
开启防刷新,严禁刷新太快.

 

10055:没有缓存空间可利用

Quote:
查看下你的C盘空间是否已经满,清除一些没有用的文件.
可以在后台的”论坛核心设置”,”核心功能设置”里”进程优化”开启,”GZIP 压缩输出”关闭.
查找了一下10055(没有缓存空间可利用)出错的原因,分析了my.ini的配制文件,
在my.ini中如下:
default-storage-engine=INNODB
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=10M
innodb_log_file_size=10M
innodb_thread_concurrency=8
觉得可以把innodb_buffer_pool_size=10M 加大如100M或是1000M
以上是对mysql5的

如果是mysql4可以在my.ini中增加如下:
#innodb_data_file_path = ibdata1:2000M;ibdata2:2000M
#innodb_data_home_dir = c:ibdata
#innodb_log_group_home_dir = c:iblogs
#innodb_log_arch_dir = c:iblogs
#set-variable = innodb_mirrored_log_groups=1
#set-variable = innodb_log_files_in_group=3
#set-variable = innodb_log_file_size=5M
#set-variable = innodb_log_buffer_size=8M
#innodb_flush_log_at_trx_commit=1
#innodb_log_archive=0
#set-variable = innodb_buffer_pool_size=16M
#set-variable = innodb_additional_mem_pool_size=2M
#set-variable = innodb_file_io_threads=4
#set-variable = innodb_lock_wait_timeout=50
把前面的#去了

 

10061:MySQL服务不能正常启动

Quote:
启动这台机器上的MySQL服务
如服务启动失败,一定是你的my.ini文件出了差错, MySQL服务不能正常启动
你删除了它后,MySQL就会按其默认配置运行,那就没有问题了

设置MySQL数据库同步-mysql双机热备资料集锦

摘要:mysql从3.23.15版本以后提供数据库复制功能,而以前,数据库双机热备还仅是大型数据库的专利,利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能。

MYSQL5.0双机热备

原文网址:http://blog.csdn.net/lgjlry/archive/2007/12/01/1910094.aspx

        近日研究mysql 5.0.* Replication.费了好大劲终于搞明白了,拿出来和大家一起分享.(假设你已经在linux系统上面安装了mysql5.0.* 并且熟悉基本的linux命令.我的系统为Fedora Core 7,mysql为5.0.37).搭建一个mysql replication的双主从结构,即两台主机A:192.168.0.2,B:192.168.0.3互为master/slave.因而, mysql的版本必须一致才行,以下为操作过程,详细的原因待后面解释.

①    分别在主机A,B上面建立用于Replication的用户.给予REPLICATION SLAVE权限即可

shell>mysqld_safe -user=mysql&

shell>mysql -uroot -ppassword

mysql>GRANT REPLICATION SLAVE ON *.*

    -> TO ‘repl’@’192.168.0.%’ IDENTIFIED BY ‘repl’;

mysql>quit;

##停止mysql Server.

shell>mysqladmin shutdown -uroot -ppassword

②如若两台机器的数据库不一致,则将某一台的数据转移到另外一台,例如将A数据库备份到B.主机A打包要复制的数据库,转移到B机器.否则,直接执行步骤③即可..

shell> cd /usr/local/mysql/

/usr/local/mysql/#shell#> tar -zcvf var.tar.gz var

这样,我们得到一个mysql数据库的打包文件var.tar.gz

在B机器上删除以前的数据库文件,将var.tar.gz复制到此处,修改权限

shell> cd /usr/local/mysql/

/usr/local/mysql/#shell#>rm -fr var

/usr/local/mysql/#shell#>tar -zxvf var.tar.gz

/usr/local/mysql/#shell#>cd var

/usr/local/mysql/var/#shell#>chown -R root .

/usr/local/mysql/var/#shell#>chown -R mysql .

③分别修改A,B主机的mysql 配置文件.均如下操作

shell>vi /etc/my.cnf

          ##找到[mysqld],添加一行’log-bin’,并且设置A,B主机的server-id为两个不同的整数即可.例如##

          ## A主机修改为

[mysqld]

log-bin

server-id=1

          ## B主机修改为

[mysqld]

log-bin

server-id=2

          ##保存退出

④A主机用如下方式启动mysql.

shell>mysqld_safe –skip-slave-start –user=mysql&

          ##登陆mysql

shell>mydql -uroot -ppassword

mysql>change master to

    ->MASTER_HOST=’192.168.0.3′, ##主机B的ip

    ->MASTER_USER=’repl’,

    ->MASTER_PASSWORD=’repl’;

mysql> start slave;

⑤B主机也用如下方式启动mysql.

shell>mysqld_safe –skip-slave-start –user=mysql&

          ##登陆mysql

shell>mydql -uroot -ppassword

mysql>change master to

    ->MASTER_HOST=’192.168.0.2′, ##主机A的ip

    ->MASTER_USER=’repl’,

    ->MASTER_PASSWORD=’repl’;

mysql> start slave;

⑥现在已基本完成了操作,在任意一台运行如下命令查看master/slave状态

mysql> show master status;  ##如果Server-id没有设置,此处将会有警告信息

+———————-+————–+————–+——————+

| File                | Position    | Binlog_Do_DB | Binlog_Ignore_DB |

+———————-+————–+————–+——————+

| localhost-bin.000003 | 98          |              |                  |

+———————-+————–+————–+——————+

1 row in set (0.03 sec)  

****************************************

mysql> show slave status;

—–+——————–+—————–+——————-+—————-+———————–+

| Slave_IO_State                            | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File      | Read_Master_Log_Pos | Relay_Log_File            | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table

—–+——————–+—————–+——————-+—————-+———————–+

| Waiting for master to send event | 192.168.0.3 | repl                | 3306              | 60                       | localhost-bin.000003 | 98                  | localhost-relay-bin.000008 | 239          | localhost-bin.000003 | Yes              | Yes              |                |                    |                    |                        |                        |                            | 0          |            |  0          | 98                  | 239            |

……

1 row in set (0.01 sec)

*****************************************

mysql> show processlist;

+—+————-+——————-+——+————-+——+———————————————————————–+——————+

| Id| User        | Host              | db  | Command    | Time | State                                                                | Info |

+—+————-+——————-+——+————-+——+———————————————————————–+——————+

| 1 | system user |                  | NULL | Connect    | 2073 | Waiting for master to send event                                      | NULL            |

| 2 | system user |                  | NULL | Connect    | 1426 | Has read all relay log; waiting for the slave I/O thread to update it | NULL            |

| 5 | repl        | 192.168.0.3:48356 | NULL | Binlog Dump | 832  | Has sent all binlog to slave; waiting for binlog to be updated        | NULL            |

| 6 | root        | localhost        | NULL | Query      | 0    | NULL                                                                  | show processlist |

+—-+————-+——————-+——+————-+——+———————————————————————-+——————+

4 rows in set (0.00 sec)

***此处应该有3个以上的id才正确.

**************************************************************************************************************************************** 版本问题:

        mysql的replication,原则上master的版本不应高于slave.这个问题的原因,涉及到replication的原理(异步复制基本原理):

        从MySQL3.23.15以后,MySQL支持单向的异步复制。也就是说,1台MySQL服务器充当Master(主库),1台或多台MySQL服务器充当Slaves(从库),数据从Master向Slaves进行异步复制。注意,这种复制是异步的,有别于MySQL的同步复制实现(这种实现称做 MySQL集群,MySQL Cluster)。

        当主库有更新的时候,主库的一个线程会把更新操作的SQL写入二进制日志(Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个I/O线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个I/O线程,实现这两部分的功能。(因而,在本试验中,mysql>show processlist 至少应该有3个process)。主库中的任何操作,从库都可以处理,因而要求master的版本不应高于slave.

有几个关键性的地方需要注意:

– 主库必须启用Bin log,主库和从库必须有唯一的Server Id

– 从库必须清楚了解从主库的哪一个Bin log文件的哪一个偏移位置起开始复制

– 主库和从库的MySQL版本需保持一致

        用户及权限:从mysql 4 开始,添加了一个专门的权限,用来做热备,这个权限本质应该还是文件读取权限,但是应该只能用来读取日志,防止一些漏洞。

        对于客户端来说,就是设置这个账号,密码,主服务器地址。这只是单向的,再配置一个对等的同步通道,就支持双向的热备了。

        为了方便,AB主机都添加了repl热备用户,此处用户名,密码等你可以任意选择,只要在change master 的时候,添加正确即可.初次做这个的时候,你也可以给予all privileges. mysql并不赞同这么给予权限,说是因为安全的原因.  GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.0.%’ IDENTIFIED BY ‘repl’;这个语句授权的前提是两台主机位于同一个网段.其实,随你怎么设置,只要主机A能在主机B上用repl用户访问,主机B能在主机A上用 repl用户访问即可.

        配置文件:按照官方手册,添加log-bin即表示当前主机将作为master. log-bin也可以带参数:log-bin=sql-bin (用与记录操作的二进制文件名). 初次做这个的朋友,最好不要带参数,否则会比较麻烦的.在任何时候,你都可以用

mysql> CHANGE MASTER TO

    ->    MASTER_HOST=’master_host_name’,

    ->    MASTER_USER=’replication_user_name’,

    ->    MASTER_PASSWORD=’replication_password’;

后重启来更改master.

        Show Slave status:此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.

更多详细信息以及参数设置,请参考MySQL 5.0 Manual手册.

————————————————————

如何设置MySQL同步(mysql双机热备)

来源: www.ixdba.net  作者: IXDBA.NET社区

        MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。本文描述了常见的同步设置方法。

同步有两种形式:

“主-从”,和“主-主”。

一:“主-从”方式

1、准备服务器

        由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

        本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是4.1.24,操作系统是Redhat Linux AS4.0,假设同步Master的主机ip为:192.168.60.219,Slave主机ip为:192.168.60.132,2个MySQL的 basedir目录都是/usr/local/mysql,datadir都是:/usr/local/mysql/data(即为mysql数据库的默认数据目录)。

2、设置同步服务器

(1)、设置同步Master

        每个同步服务器都必须设定一个唯一的编号,否则同步就不能正常运行了。接下来配置数据库同步配置文件,mysql数据库的配置文件默认名为my.cnf,数据库启动的时候从默认的data目录下读取my.cnf的信息,如果data下没有这个文件,可以建立一个,my.cnf的模板默认一般在 mysql/support-files目录下,在此目录下有各种情况下的cnf文件,如my-huge.cnf,my-large.cnf,my- medium.cnf,my-small.cnf等等,根据情况,选择my-medium.cnf即可,然后拷贝到data下,改名为my.cnf.开始修改 my.cnf,增加以下几行:

log-bin

server-id = 1  (标识为master库)

sql-bin-update-same

binlog-ignore-db=mysql

set-variable=binlog-ignore-db=mysql  #指定需要日志的数据库

        然后在Master上增加一个账号专门用于同步,如下:

mysql>GRANT REPLICATION SLAVE ON *.* TO

backup@192.168.60.132此邮件地址受spam bots保护,需要使用 Javascript 功能来查阅。 IDENTIFIED BY ‘1234’;

        如果想要在Slave上有权限执行 “LOAD TABLE FROM MASTER” 或 “LOAD DATA FROM MASTER” 语句的话,必须授予全局的 FILE 和 SELECT 权限:

mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO

backup@192.168.60.132此邮件地址受spam bots保护,需要使用 Javascript 功能来查阅。 IDENTIFIED BY ‘1234’;

        上面my.cnf文件中第四行表示不记录数据库mysql的更新日志,这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。

        最后设置完成my.cnf,设置完成后,首先检查mysql/data目录下是否有mysql的启动关闭日值,类似的为*.info,localhost*,ib*之类的日值信息。如果有删除,然后在master服务器上启动mysql。可以通过查看data下的 localhost.localdomain.err文件,测试master于Slave的连通情况。,同时用show slave status看同步配置情况。

        接下来备份Master上的数据,首先执行如下SQL语句:

mysql>FLUSH TABLES WITH READ LOCK;

        不要退出这个终端,否则这个锁就不生效了;接着导出数据,可以直接打包压缩数据文件,也可以使用mysqldump工具来做,推荐前者的方法,这样更为快捷简便。

root$cd /usr/local/mysql

root$tar zcf data.tar.gz ./data (在这里也可能是 “var” 等其它实际存放数据文件的目录,根据实情而定)

        然后将这些数据拷贝到Slave服务器上,解开,设置好正确的权限及属主等之后,

        启动Slave数据库,然后用”UNLOCK TABLES” 语句来释放锁。然后关闭数据库。

(2)、设置Slave

        同主数据库一样,找到my.cnf的模板,修改成my.cnf,增加如下几行:

server-id = 2 (Slave服务器标识)

master-host = 192.168.60.219 #主服务器名

master-user = backup  #同步账户名,默认是test

master-password =1234 #同步帐户密码,默认是空

master-port = 3306 #主服务器的 TCP/IP 端口号,默认是3306

set-variable=replicate-ignore-db=mysql #略过同步的数据库名,如果有多个,请设置多次

set-variable=replicate-do-db=cicro #想要同步的数据库名,如果有多个,请设置多次。

master-connect-retry=10  预设重试间隔60秒

        设置完成后,首先检查mysql/data目录下是否有mysql的启动关闭日值,类似的为*.info,localhost*,ib*之类的日值信息。如果有删除,然后在Slave服务器上启动mysql,然后在Slave上检验一下是否能正确连接到Master上,并且具备相应的权限。可以通过查看 data下的localhost.localdomain.err文件,测试Slave与master的连通情况。

root$mysql –h192.168.60.219 –ubackup –p 1234

mysql>SHOW GRANTS;

+———————————————————————-

| Grants for backup@192.168.60.132此邮件地址受spam bots保护,需要使用 Javascript 功能来查阅。      

+———————————————————————–

| GRANT SELECT, FILE, REPLICATION SLAVE ON *.* TO ‘backup’@’192.168.60.132’

IDENTIFIED BY PASSWORD ‘*9FF2C222F44C7BBA5CC7E3BE8573AA4E1776278C’      |

+—————————————————————————

现在,重新启动Slave。启动成功后,登录Slave,查看一下同步状态:

mysql -hlocalhost -uroot

mysql>SHOW SLAVE STATUS\G

*************************** 1. row ***************************

             Slave_IO_State: Waiting for master to send event

                Master_Host: 192.168.60.132

                Master_User: backup

                Master_Port: 3306

               Connect_Retry: 10

               Master_Log_File: localhost-bin.000002

               Read_Master_Log_Pos: 1556

               Relay_Log_File: localhost-relay-bin.000004

              Relay_Log_Pos: 51

        Relay_Master_Log_File: localhost-bin.000002

        Slave_IO_Running: Yes

          Slave_SQL_Running: Yes

            Replicate_Do_DB: cicro,cicro

。。。。。。

      Seconds_Behind_Master: 0

1 row in set (0.00 sec)

        可以看到,Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 “Yes”,这表明 Slave 的 I/O 和 SQL 线程都在正常运行。至此,主-从同步设定成功。

二:“主-主”方式:

        如果在master中加入slave设置,在Slave加入master设置,则就成了“主-主”同步方式。

1:配置master服务器

        接着上面的配置,在master的my.cnf中加入一下配置信息:

master-host=192.168.60.132

master-user=backup

master-password=1234

replicate-do-db=cicro

master-connect-retry=10  预设重试间隔60秒

2:配置slave服务器:

首先在slave上增加一个账号专门用于同步,如下:

mysql> GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO

backup@192.168.60.219此邮件地址受spam bots保护,需要使用 Javascript 功能来查阅。 IDENTIFIED BY ‘1234’;

在slave的配置文件my.cnf中添加以下信息:

binlog-do-db=cicro

        注意:当有错误产生时检查slave的data目录下*.err日志文件。此时同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start。同样,首先删除两台服务器data下的日志信息,然后依次启动slave,master。实现双机互备。

——————————————————–

Mysql 数据库双机热备的配置

http://database.51cto.com/art/200510/8434.htm

摘要:mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,实现mysql数据库的热备份。

1。mysql数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中。实现mysql数据库的热备份。

2。要想实现双机的热备首先要了解主从数据库服务器的版本的需求。要实现热备mysql的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。

3。设置主数据库服务器:

        a.首先查看主服务器的版本是否是支持热备的版本。然后查看my.cnf(类unix)或者my.ini(windows)中mysqld配置块的配置有没有log-bin(记录数据库更改日志),因为mysql的复制机制是基于日志的复制机制,所以主服务器一定要支持更改日志才行。然后设置要写入日志的数据库或者不要写入日志的数据库。这样只有您感兴趣的数据库的更改才写入到数据库的日志中。

server-id=1 //数据库的id这个应该默认是1就不用改动

log-bin=log_name //日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称

binlog-do-db=db_name //记录日志的数据库

binlog-ignore-db=db_name //不记录日志的数据库

以上的如果有多个数据库用”,”分割开

然后设置同步数据库的用户帐号

mysql> GRANT REPLICATION SLAVE ON *.*

-> TO ‘repl’@’%.mydomain.com’ IDENTIFIED BY ‘slavepass’;

4.0.2以前的版本, 因为不支持REPLICATION 要使用下面的语句来实现这个功能

mysql> GRANT FILE ON *.*

-> TO ‘repl’@’%.mydomain.com’ IDENTIFIED BY ‘slavepass’;

设置好主服务器的配置文件后重新启动数据库

        b.锁定现有的数据库并备份现在的数据

锁定数据库

mysql> FLUSH TABLES WITH READ LOCK;

备份数据库有两种办法一种是直接进入到mysql的data目录然后打包你需要备份数据库的文件夹,第二种是使用mysqldump的方式来备份数据库但是要加上”–master-data ” 这个参数,建议使用第一种方法来备份数据库

c.查看主服务器的状态

mysql> show master status\G;

+—————+———-+————–+——————+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+—————+———-+————–+——————+

| mysql-bin.003 | 73 | test | manual,mysql |

+—————+———-+————–+——————+

记录File 和 Position 项目的值,以后要用的。

d.然后把数据库的锁定打开

mysql> UNLOCK TABLES;

4。设置从服务器

        a.首先设置数据库的配置文件

server-id=n //设置数据库id默认主服务器是1可以随便设置但是如果有多台从服务器则不能重复。

master-host=db-master.mycompany.com //主服务器的IP地址或者域名

master-port=3306 //主数据库的端口号

master-user=pertinax //同步数据库的用户

master-password=freitag //同步数据库的密码

master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差

report-host=db-slave.mycompany.com //报告错误的服务器

        b.把从主数据库服务器备份出来的数据库导入到从服务器中

        c.然后启动从数据库服务器,如果启动的时候没有加上”–skip-slave-start”这个参数则进入到mysql中

mysql> slave stop; //停止slave的服务

        d.设置主服务器的各种参数

mysql> CHANGE MASTER TO

-> MASTER_HOST=’master_host_name’, //主服务器的IP地址

-> MASTER_USER=’replication_user_name’, //同步数据库的用户

-> MASTER_PASSWORD=’replication_password’, //同步数据库的密码

-> MASTER_LOG_FILE=’recorded_log_file_name’, //主服务器二进制日志的文件名(前面要求记住的参数)

-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记住的参数)

        e.启动同步数据库的线程

mysql> slave start;

查看数据库的同步情况吧。如果能够成功同步那就恭喜了!

查看主从服务器的状态:

mysql> SHOW PROCESSLIST\G //可以查看mysql的进程看看是否有监听的进程

        如果日志太大清除日志的步骤如下

1.锁定主数据库

mysql> FLUSH TABLES WITH READ LOCK;

2.停掉从数据库的slave

mysql> slave stop;

3.查看主数据库的日志文件名和日志文件的position

show master status;

+—————+———-+————–+——————+

| File | Position | Binlog_do_db | Binlog_ignore_db |

+—————+———-+————–+——————+

| louis-bin.001 | 79 | | mysql |

+—————+———-+————–+——————+

4.解开主数据库的锁

mysql> unlock tables;

5.更新从数据库中主数据库的信息

mysql> CHANGE MASTER TO

-> MASTER_HOST=’master_host_name’, //主服务器的IP地址

-> MASTER_USER=’replication_user_name’, //同步数据库的用户

-> MASTER_PASSWORD=’replication_password’, //同步数据库的密码

-> MASTER_LOG_FILE=’recorded_log_file_name’, //主服务器二进制日志的文件名(前面要求记住的参数)

-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记住的参数)

6.启动从数据库的slave

mysql> slave start;

——————————————————————————————–

mysql双机热备份的实现步骤

原文网址:   http://www.jb51.net/article/10182.htm

设置 MySql 数据同步

摘要

mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能。

数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是my.cnf)

在unix环境下在/etc/mysql/my.cnf 或者在mysql用户的home目录下面的my.cnf。

window环境中,如果c:根目录下有my.cnf文件则取该配置文件。当运行mysql的winmysqladmin.exe工具时候,该工具会把 c:根目录下的my.cnf 命名为mycnf.bak。并在winnt目录下创建my.ini。mysql服务器启动时候会读该配置文件。所以可以把my.cnf中的内容拷贝到 my.ini文件中,用my.ini文件作为mysql服务器的配置文件。

设置方法:

设置范例环境:

操作系统:window2000 professional

mysql:4.0.4-beta-max-nt-log

A ip:10.10.10.22

B ip:10.10.10.53

A:设置

1.增加一个用户最为同步的用户帐号:

GRANT FILE ON *.* TO backup@’10.10.10.53′ IDENTIFIED BY ‘1234′

2.增加一个数据库作为同步数据库:

create database backup

B:设置

1.增加一个用户最为同步的用户帐号:

GRANT FILE ON *.* TO backup@’10.10.10.22′ IDENTIFIED BY ‘1234′

2.增加一个数据库作为同步数据库:

create database backup

主从模式:A->B

A为master

修改A mysql的my.ini文件。在mysqld配置项中加入下面配置:

server-id=1

log-bin

#设置需要记录log 可以设置log-bin=c:mysqlbakmysqllog 设置日志文件的目录,

#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。

binlog-do-db=backup #指定需要日志的数据库

重起数据库服务。

用show master status 命令看日志情况。

B为slave

修改B mysql的my.ini文件。在mysqld配置项中加入下面配置:

server-id=2

master-host=10.10.10.22

master-user=backup #同步用户帐号

master-password=1234

master-port=3306

master-connect-retry=60 预设重试间隔60秒

replicate-do-db=backup 告诉slave只做backup数据库的更新

重起数据库

用show slave status看同步配置情况。

注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info

所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。

双机互备模式。

如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。

在A的配置文件中 mysqld 配置项加入以下设置:

master-host=10.10.10.53

master-user=backup

master-password=1234

replicate-do-db=backup

master-connect-retry=10

在B的配置文件中 mysqld 配置项加入以下设置:

log-bin=c:mysqllogmysqllog

binlog-do-db=backup

注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start

重起AB机器,则可以实现双向的热备。

测试:

向B批量插入大数据量表AA(1872000)条

A数据库每秒钟可以更新2500条数据。

——————————————————

mysql 双机热备实战 –安恒网管员手记

http://www.anheng.com.cn/news/html/net_admin_blog/mysql%20cluster.html

2005-04-20    刘世伟

         mysql实现双机热备,原理是通过更新日志,用mysql的SELECT的文件操作功能,备机实时抓取主机的更新日志,当然这只是其原理,实际上并不需要我们自己去处理日志,明白了原理,实施就比较容易理解了。

          这样,在主机端需要开一个账号,这个账号是备机用来抓取主机的更新日志。需要有文件访问权限,在早期,刚开始实现双机热备时,就是用的文件权限。从 mysql4 开始,添加了一个专门的权限,用来做热备,这个权限本质应该还是文件读取权限,但是应该只能用来读取日志,防止一些漏洞。对于客户端来说,就是设置这个账号,密码,主服务器地址,还有要同步的数据库名。这只是单向的,再配置一个对等的同步通道,就支持双向的热备了。

         通过热备,还可以备端从主端load全部数据。这个在同步出错时可以使用。load权限是一个单独的mysql权限,这样跟热备有关的mysql的权限有 2个,日志抓取和数据载入(REPLICATION SLAVE, REPLICATION CLIENT )

在服务器端开备份账号

GRANT REPLICATION SLAVE , REPLICATION CLIENT ON * . * TO “backup”@ “192.168.1.2”IDENTIFIED BY “*****”WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 ;

在服务器端打开日志功能

/etc/mysql/my.cnf

[mysqld]

server-id = 1

log-bin

binlog-do-db = pa

max_binlog_size = 104857600

————–

这样,mysql会在数据目录放置pa这个库的更新日志。等待备机来抓取。

客户端设置:

/etc/mysql/my.cnf

master-host=192.168.1.1

master-user=backup

master-password=12345

master-port=3306

master-connect-retry=60

replicate-do-db=pa

客户端会到服务器抓取pa库的更新日志,来更新本地的pa库。

几个跟热备有关的mysql命令:(需要在mysql命令行界面或query )

stop slave    #停止同步

start slave    #开始同步,从日志终止的位置开始更新。

SET SQL_LOG_BIN=0|1  #主机端运行,需要super权限,用来开停日志,随意开停,会造成主机从机数据不一致,造成错误

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n  # 客户端运行,用来跳过几个事件,只有当同步进程出现错误而停止的时候才可以执行。

RESET MASTER  #主机端运行,清除所有的日志,这条命令就是原来的FLUSH MASTER

RESET SLAVE   #从机运行,清除日志同步位置标志,并重新生成master.info

虽然重新生成了master.info,但是并不起用,最好,将从机的mysql进程重启一下,

LOAD TABLE tblname FROM MASTER #从机运行,从主机端重读指定的表的数据,每次只能读取一个,受timeout时间限制,需要调整timeout时间。执行这个命令需要同步账号有 reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值

LOAD DATA FROM MASTER  #从机执行,从主机端重新读入所有的数据。执行这个命令需要同步账号有reload和super权限。以及对相应的库有select权限。如果表比较大,要增加net_read_timeout 和 net_write_timeout的值

CHANGE MASTER TO master_def_list  #在线改变一些主机设置,多个用逗号间隔,比如

CHANGE MASTER TO

  MASTER_HOST=’master2.mycompany.com’,

  MASTER_USER=’replication’,

  MASTER_PASSWORD=’bigs3cret’

MASTER_POS_WAIT() #从机运行

SHOW MASTER STATUS #主机运行,看日志导出信息

SHOW SLAVE HOSTS #主机运行,看连入的从机的情况。

SHOW SLAVE STATUS (slave)

SHOW MASTER LOGS (master)

SHOW BINLOG EVENTS [ IN ‘logname’ ] [ FROM pos ] [ LIMIT [offset,] rows ]

PURGE [MASTER] LOGS TO ‘logname’ ; PURGE [MASTER] LOGS BEFORE ‘date’

下面是Q&A时间:

双机热备怎么配置?照上面再配置一个反向的更新就行了。

不用担心本机的更改会回环回来,因为server_id就是识别这个用的.

多机热备怎么做,几台mysql服务器就像首尾相连的蛇,组成一个环状,就可以了,而且还可以作几个单向的更新,用以分担select这样的读取操作的压力,因为mysql操作中大部分是select操作.

————————————————————————-

MYSQL完整安装和主从双机配置

http://www.cnscn.org/htm_data/288/0811/17467.html

。。。。。。

################################# mysql 完整安装完成 ###########################

按照上面的步骤两台服务器同时安装,并保证可以启动mysql

1. 理想情况,应在主服务器和从服务器上使用最近版本的MySQL。

2. 在主服务器上为服务器设置一个连接账户。

mysql> GRANT REPLICATION SLAVE ON *.* TO

[email=’test’@’192.168.0.2′]’test’@’192.168.0.2′[/email]

IDENTIFIED BY

[email=’db@test’]’db@test'[/email]

3. 关闭主从数据库

linux-A:/data # /usr/local/mysql/bin/mysqladmin shutdown

linux-B:/data # /usr/local/mysql/bin/mysqladmin shutdown

linux-A:/etc # vi my.cnf

在[mysqld] 段内加入

server-id = 1 #设置主机id标识

binlog-do-db = test #设置需要同步的数据库,如果有多个数据库,每个数据库一行

log-bin = /data/mysql5051_db/binlog/master.log #mysql日志

7. 修改从数据库的配置文件 my.cnf

linux-B:/etc # vi my.cnf

在[mysqld] 段内加入

server-id = 2 #设置从机id标识,如果有多个从机,可以顺序增加ID为3,4…

master-host = 192.168.0.1 #主机地址

master-user = test #主机mysql数据库用户

master-password =

[email=db@test]db@test[/email]

#主机mysql数据库密码

replicate-do-db = test #同步的数据库,如果有多个数据库,每个数据库一行

log-bin = /data/mysql5051_db/binlog/slave.log #本机mysql日志

relay-log = /data/mysql5051_db/binlog/relay.log #同步日志

log-slave-updates #同步方式

read-only

master-connect-retry=60

8. 开启主从数据库

/usr/local/mysql/bin/mysqld_safe -umysql &

9. 看同步情况

mysql> show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

证明同步已经成功!

10.导入数据

主:

create database test

这里备机也会有这个库了,也就是说MYSQL将创建数据库的操作也同步了,够强吧。

然后,再把数据导入即可:

[email=root@test:/data]root@test:/data[/email]

# /usr/local/mysql/bin/mysql test

mysql启动时,如果./configure时不指定–defaults-extra-file=/usr/local/mysql/data/my-small.cnf

默认就是–defaults-extra-file=/etc/my.cnf

c#读sqlserver数据添加到MySQL数据库

备用 使用编码utf8

解决了乱码问题

1.连接:

1.安装Microsoft ODBC.net。

2.安装MySQL的ODBC驱动程序。

2.解决方案管理中添加引用Microsoft.Data.Odbc.dll(1.0.3300)

using System;
using System.Collections.Generic;
using System.Text;
using Console = System.Console;
using Microsoft.Data.Odbc;

using System.Data;
using System.Data.SqlClient;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                connSqlserver();
            }
            catch (OdbcException MyOdbcException)
            {
                for (int i = 0; i < MyOdbcException.Errors.Count; i++)
                {
                    Console.Write("ERROR #" + i + "\n" +
                    "Message: " + MyOdbcException.Errors[i].Message + "\n" +
                    "Native: " + MyOdbcException.Errors[i].NativeError.ToString() + "\n" +
                    "Source: " + MyOdbcException.Errors[i].Source + "\n" +
                    "SQL: " + MyOdbcException.Errors[i].SQLState + "\n");
                }
            }

            
            Console.ReadLine();

        }

        public void ceshi()
        {
            try
            {
                string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
                "SERVER=localhost;" +
                "DATABASE=jy;" +
                "UID=root;" +
                "PASSWORD=123;" +
                "OPTION=3;CharSet=gb2312;";

                OdbcConnection MyConnection = new OdbcConnection(MyConString);
                MyConnection.Open();

                Console.WriteLine("\n !!! success, connected successfully !!!\n");


                //Create a sample table
                OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net", MyConnection);
                MyCommand.ExecuteNonQuery();
                MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name varchar(20), idb bigint)";
                MyCommand.ExecuteNonQuery();

                //Insert
                MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'" + filter("中国,''") + "', 300)";
                Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); ;

                //Insert
                MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',400)";
                Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());

                //Insert
                MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(20,'mysql',500)";
                Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());

                //Update
                MyCommand.CommandText = "UPDATE my_odbc_net SET id=999 WHERE id=20";
                Console.WriteLine("Update, Total rows affected:" + MyCommand.ExecuteNonQuery());

                //COUNT(*) 
                MyCommand.CommandText = "SELECT COUNT(*) as TRows FROM my_odbc_net";
                Console.WriteLine("Total Rows:" + MyCommand.ExecuteScalar());

                //Fetch
                MyCommand.CommandText = "SELECT * FROM my_odbc_net";
                OdbcDataReader MyDataReader;
                MyDataReader = MyCommand.ExecuteReader();
                while (MyDataReader.Read())
                {
                    if (string.Compare(MyConnection.Driver, "myodbc3.dll") == 0)
                    {
                        Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +
                        MyDataReader.GetString(1) + " " +
                        MyDataReader.GetInt64(2)); //Supported only by Connector/ODBC 3.51
                    }
                    else
                    {
                        Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " +
                        MyDataReader.GetString(1) + " " +
                        MyDataReader.GetInt32(2)); //BIGINTs not supported by Connector/ODBC
                    }
                }

                //Close all resources
                MyDataReader.Close();
                MyConnection.Close();
            }
            catch (OdbcException MyOdbcException)//Catch any ODBC exception ..
            {
                for (int i = 0; i < MyOdbcException.Errors.Count; i++)
                {
                    Console.Write("ERROR #" + i + "\n" +
                    "Message: " + MyOdbcException.Errors[i].Message + "\n" +
                    "Native: " + MyOdbcException.Errors[i].NativeError.ToString() + "\n" +
                    "Source: " + MyOdbcException.Errors[i].Source + "\n" +
                    "SQL: " + MyOdbcException.Errors[i].SQLState + "\n");
                }
            }
        }


        public static void connSqlserver()
        {
            string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" +
                "SERVER=localhost;" +
                "DATABASE=zs;" +
                "UID=root;" +
                "PASSWORD=123;" +
                "OPTION=3;CharSet=gb2312;";

            OdbcConnection MyConnection = new OdbcConnection(MyConString);
            MyConnection.Open();
            OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net", MyConnection);
            MyCommand.ExecuteNonQuery();


            //使用轻量级的SqlDataReader显示数据
            //指定Sql Server提供者的连接字符串
            string connString = "Data Source=PC-200908231053\\SQLEXPRESS;database=occupationNew;User id=sa;PWD=123";

            //建立连接对象

            SqlConnection Sqlconn = new SqlConnection(connString);
            //打开连接
            Sqlconn.Open();

            
            string thisCommand = "select * from Article where ID >"+ 1243931905062 +"order by ID";

            //创建SqlDataAdapter对象,有两个参数,一个是查询字符串,一个是连接对象
            SqlDataAdapter SqlDap = new SqlDataAdapter(thisCommand, Sqlconn);

            //创建DataSet对象

            DataSet thisDataset = new DataSet();

            //使用SqlDataAdapter的Fill方法填充DataSet,有两个参数,一个是创建的DataSet实例,一个是填入的表

            SqlDap.Fill(thisDataset, "informations");

            //显示查询结果

            foreach (DataRow theRow in thisDataset.Tables["informations"].Rows)
            {
                //Console.WriteLine(theRow["InformationId"] + "\t" + theRow["companyName"]);
                //MyCommand.CommandText = "INSERT INTO information(companyname,course,major,number,sex,pay,request,informationsource,datetime,job,workprovinci,detailplace,isbin,enddate,existcourse,academymajororder) "
                //    + "VALUES('" + filter(theRow["CompanyName"]) + "','" + filter(theRow["Course"]) + "','" + filter(theRow["Major"]) + "','" + filter(theRow["Number"]) + "','" + filter(theRow["Sex"]) + "','" + filter(theRow["Pay"]) + "','" + filter(theRow["request"]) + "','" + filter(theRow["informationSource"]) + "','" + filter(theRow["DateTime"]) + "','" + filter(theRow["Job"]) + "','" + filter(theRow["WorkProvince"]) + "','" + filter(theRow["DetailPlace"]) + "','" + filter(theRow["IsBin"]) + "','" + filter(theRow["EndDate"]) + "','" + filter(theRow["ExistCourse"]) + "','" + filter(theRow["AcademyMajorOrder"]) + "')";


                Console.WriteLine(theRow["ID"] + "\t" + theRow["Title"]);
                MyCommand.CommandText = "INSERT INTO downloads(title,fenlei,content,lint,updatetime,click) "
                    + "VALUES('" + filter(theRow["Title"]) + "','" + filter(theRow["CategoryID"]) + "','" + filter(theRow["Content"]) + "','" + filter(theRow["Author"]) + "','" + filter(theRow["DateTime"]) + "','" + filter(theRow["Hits"]) + "')";

                //Console.WriteLine(theRow["ID"] + "\t" + theRow["Title"]);
                //MyCommand.CommandText = "INSERT INTO xinwens(title,fenlei,content,username,updatetime,click) "
                //    + "VALUES('" + filter(theRow["Title"]) + "','" + "" + "','" + filter(theRow["Content"]) + "','" + filter("大学生就业指导中心") + "','" + filter(theRow["DateTime"]) + "','" + 0 + "')";
                



                Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery());
            }
            Sqlconn.Close();

            Console.ReadLine();


        }

        public static string filter(object text)
        {
            System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
            System.Text.Encoding UTF8 = System.Text.Encoding.UTF8;
            byte[] data = GB2312.GetBytes(text.ToString());
            string msg = GB2312.GetString(data);
            return msg.Replace(",", ",").Replace("'", "’").Replace("―", "-");

        }
    }
}

mysql双机热备

 

主服务器
serverA

从服务器
serverB

 
  从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务。  从狭义上讲,双机热备特指基于active/standby方式的服务器热备。服务器数据包括数据库数据同时往两台或多台服务器写,或者使用一个共享的存储设备。在同一时间内只有一台服务器运行。当其中运行着的一台服务器出现故障无法启动时,另一台备份服务器会通过软件诊测(一般是通过心跳诊断)将standby机器激活,保证应用在短时间内完全恢复正常使用。

要想实现双机的热备首先要了解主从数据库服务器的版本的需求。要实现热备mysql的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。

首先要备份数据库,如果可能会有数据写入,则要锁定数据库。

 

以下操作均是以root用户登录

 

一、设置账户

 

在主服务器和从服务器上分别创建账户,

主服务器上:


mysql>grant replication slave on *.* to '用户名'@'从服务器ip' identified by '密码';

 

从服务器上:


mysql>grant replication slave on *.* to '用户名'@'主服务器ip' identified by '密码';

 

测试是否能够连接:

主服务器:mysql -h从服务器ip -u用户名(从服务器上创建) -p密码

如果能进到mysql下说明连接成功,如果报错,cann’t connect to 从服务器ip ,大致是这样,是因为,从服务器上的

防火墙限制了连接,要在防火墙里设置例外,添加主服务器ip以及所访问从服务器mysql的端口号。

从服务器同样。

 

 成功往下走

二、配置

编辑

serverA


my.ini

文件,在

mysqld

下添加如下信息:




server-id=1(主服务器ID,不能重复)
binlog-do-db=labostest(要复制的库)
log-bin="C:/mysql/log"(log文件存放处,最后的参数表明日志文件名,replication是基于log来实现复制的)
#replication slave
master-host=192.168.1.108(设置从服务器ip)
master-port=3306
master-user=backup(在从服务器上创建的用户名)
master-password=123456(对应密码)
replicate-do-db=labostest(要复制的库)
replicate-do-db=labostest1(要复制的另一个数据库)
master-connect-retry=60(连接时间)

 

 

 

然后编辑

serverB



my.ini

文件,




server-id=2(从服务器ID,不能为1)
binlog-do-db=labostest(要复制的库)
log-bin="C:/mysql/log"(log文件存放处,最后的参数表明日志文件名,replication是基于log来实现复制的)

#replication slave
master-host=192.168.1.103(设置从服务器ip)
master-port=3306
master-user=backup(在主服务器上创建的用户名)
master-password=123456(对应密码)
replicate-do-db=labostest(要复制的库)
replicate-do-db=labostest1(要复制的另一个数据库)
master-connect-retry=60(连接时间)

 
重新启动两台机器的

mysql

服务



三、查看服务器状态

 

重启服务之后,查看日志文件夹下是否生成了文件,如果是则已经加载成功,否则,并未加载以上的配置信息,

可能是修改的配置文件并不是启动mysql时要加载的配置文件,很可能在C:/windows下

修改之后,重启服务,直到日志文件夹下生成文件,否则show master status时,会一直是空集。

*************************主服务器****************************

 



show master status\G

  mysql> show master status\G;

+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+

 切换到从服务器下,,通过下面命令来设置

服务器


参数

   如果在配置文件里设置可以不用执行以下命令,直接 slave start;

   首先停止slave服务

    mysql> slave stop; //停止slave的服务

  

 

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', //主服务

器的IP地址
-> MASTER_USER='replication_user_name', //同步数据库的用户
-> MASTER_PASSWORD='replication_password', //同步数据库的密码
-> MASTER_LOG_FILE='recorded_log_file_name', //主服务器二进制日志的文件名(前面要求记住的参数)
-> MASTER_LOG_POS=recorded_log_position; //日志文件的开始位置(前面要求记住的参数)

  启动同步数据库的线程

 

 

mysql> slave start;

 

*************************从服务器******************************

 

 

 

show master status\G

  mysql> show master status\G;

+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | test | manual,mysql |
+---------------+----------+--------------+------------------+

 切换到主服务器下,通过下面命令来设置

服务器



参数

  如果在配置文件里设置可以不用执行以下命令,直接 slave start;

   首先停止slave服务

    mysql> slave stop; //停止slave的服务

  

 

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', //从服务

器的IP地址
-> MASTER_USER='replication_user_name', //同步数据库的用户
-> MASTER_PASSWORD='replication_password', //同步数据库的密码
-> MASTER_LOG_FILE='recorded_log_file_name', //从服务器

二进制日志的文件名(上面的参数)
-> MASTER_LOG_POS=recorded_log_position; //从服务器

日志文件的开始位置(上面的参数)

 

***********************分别在从服务器和主服务器上查看************************

 启动同步数据库的线程

 

 

mysql> slave start;

 

 

查看数据库的同步情况,直到成功。

 

mysql> show slave status\G
*************************** 1. row **************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 202.xx.xx.xx
                Master_User: backup
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: logbin.000002
        Read_Master_Log_Pos: 930
             Relay_Log_File: idc-ojf9p55rkb5-relay-bin.000009
              Relay_Log_Pos: 1064
      Relay_Master_Log_File: logbin.000002
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes


            Replicate_Do_DB: backuptest
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 930
            Relay_Log_Space: 1064
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

 

 

注意红色的,如果是这样,代表成功了.

主要是

 

  1.   Slave_IO_Running: Yes  
  2.   Slave_SQL_Running: Yes  

 

   如果两个均为yes就代表成功了,否则查看配置文件或是用户创建是否有问题

   通过命令来设置服务器的
参数

三、数据导入

    将当前数据导入从服务器数据库中,查看是否成功。

 

show slave status\G
show master status\G