分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Jul 30
MySQL易学易用,且附带丰富的技术文档,这二个因素使之被广泛应用。然而,随着MySQL发展之迅速,即使一个MySQL老手有时也会为该软件出其不意的功能感叹。本文将为你介绍这些不为人知的特性。

以XML格式查看查询结果

通过使用传统—xml 选项调用MySQL命令行客户程序,你可以以XML格式(而不是传统的列表形式)来查看MySQL查询结果。如果你打算将查询输出与其它程序集成在一起,这一技巧非常有用,这里是一个例子:

表A

shell> mysql --xml

mysql> Sel�ct * FROM test.stories;


This is a test
2005-07-28 00:4:57

2
This is the second test
2005-07-28 00:5:


2 rows in set (0. sec)

快速重建索引

通常情况下,如果你想改变服务器的全文搜索变量,你需要在表格中重新建立全文索引,以确保你的更新得到映射。这一操作将会花费大量的时间,特别是如果你需要处理很多数据的时候。一种快速的解决方法是使用REPAIR TABLE命令,以下为演示过程:

表B

mysql> REPAIR TABLE content QUICK;
+-----------+--------+----------+----------+
| Table| Op| Msg_type | Msg_text |
+-----------+--------+----------+----------+
| content| repair | status| OK|
+-----------+--------+----------+----------+
row in set (0.05 sec)

压缩一定的表格类型

如果你处理的是只读MyISAM表格,MySQL允许你将其压缩以节省磁盘空间。对此可以使用包括myisampack,如下所示:

表C

shell> myisampackmovies.MYI
Compressing movies.MYD: (46 records)
- Calculating statistics
- Compressing file
4.05%

使用传统SQL

MySQL支持SQL查询中的传统用法,支持IF与CASE结构。以下是一个简单的例子:

表D

mysql> Sel�ct IF (priv=, 'admin', 'guest') As usertype FROM privs Wh�re username = 'joe';
+----------+
| usertype |
+----------+
| admin|
+----------+
row in set (0.00 sec)

以CSV格式输出表格数据

MySQL输出文件包含一个全部SQL命令列表。如果你想将输出文件导入到MySQL,这一功能非常实用,但如果目标程序(比如Excel)不能与SQL相互通讯,这一方法将行不通。在这种情况下,可以通过告诉MySQL以CSV格式建立输出文件,这种CSV格式很方便地导入到绝大部分的程序。这里演示了mysqldump的操作过程:

shell> mysqldump -T . --fields-terminated-by=", " mydbmytable

这将在当前目录中生成一个文本文件,包含来自mydb.mytable列表中以逗号为间隔符的记录。

以激活strict模式减少“bad”数据的出现

MySQL服务器能够以多种不同的模式运行,而每一种都针对于特定的目的而优化。在默认情况下,没有设置模式。然而,通过在服务器命令行中添加以下选项可以很容易地改变模式的设置并将MySQL以“strict”模式运行:

shell> mysqld --sql_mode="STRICT_ALL_TABLES" &

在“strict”模式下,通过MySQL的中止查询执行并返回一个错误,服务器的很多自动修正功能都被无效化。同样,该模式下也将会执行更为严格的时间检查。

监视服务器

你可以通过运行SHOW STATUS命令获得一份服务器运行与统计的报告,包括打开连接的次数,激活查询次数,服务器正常运行时间等等。例如:

表 E

mysql> SHOW STATUS;
+------------------+-------+
| Variable_name| Value |
+------------------+-------+
| Aborted_clients| 0|
| Aborted_connects | 0|
...
| Uptime| 85|
+------------------+-------+
56 rows in set (0.6 sec)

自动返回Cr�ate TABLE代码

MySQL允许你自动获得SQL命令重新建立一个特定的表格。只简单地运行SHOW Cr�ate TABLE命令,并查看表格建立代码,如下所示:

表 F

mysql> SHOW Cr�ate TABLE products;
-----------------------------------------------------
| Table| Cr�ate Table
+----------+-----------------------------------------
| products | Cr�ate TABLE `products` (
`id` int(8) NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`price` int(0) default NULL,
PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin |
+----------+-----------------------------------------
row in set (0.27 sec)

建立一个更为有用的命令提示:

在缺省情况下,MySQL命令行客户程序显示一个简单的mysql>提示符。然而,你可以使用特定的修改内容来改变这一提示符使之变得更为有效,这些内容包括:当前用户名称,主机名称,以及当前选择的数据库。如下所示:

表 G

mysql> prompt \U:/\d>
PROMPT set to '\U:/\d>'
root@localhost:/db>

从这里的文档文件你可以获得支持MySQL客户程序更改的一个完整列表。
Tags:
Jul 30
  1、mysql 数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题。还好 mysql 数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中。实现 mysql 数据库的热备份。

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

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

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

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

  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 默认主服务器是可以随便设置但是如果有多台从服务器则不能重复。

  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 的进程看看是否有监听的进程

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

  .锁定主数据库

  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.00 | 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;
Tags:
Jul 30
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog:用于处理二进制日志文件的实用工具”。

要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf o my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为--log-bin。要想确定当前的二进制日志文件的文件名,输入下面的MySQL语句:
SHOW BINLOG EVENTS \G
你还可以从命令行输入下面的内容:
mysql --user=root -pmy_pwd -e 'SHOW BINLOG EVENTS \G'
将密码my_pwd替换为服务器的root密码。

. 指定恢复时间

对于MySQL 4..4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午0:00(今天是2006年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.23456 \
  | mysql -u root -pmypwd
该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 0:0:00" /var/log/mysql/bin.23456 \
  | mysql -u root -pmypwd \
在该行中,从上午0:0登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午0:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。

2. 指定恢复位置

也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。操作方法为:
mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 0:05:00" \
  /var/log/mysql/bin.23456 > /tmp/mysql_restore.sql
该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:
mysqlbinlog --stop-position="36832" /var/log/mysql/bin.23456 \
| mysql -u root -pmypwd
mysqlbinlog --start-position="36835" /var/log/mysql/bin.23456 \
| mysql -u root -pmypwd \
上面的第行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。
Tags:
Jul 30
当你连接一个MySQL服务器时,你通常应该使用一个口令。口令不以明文在连接上传输。所有其它信息作为能被任何人读懂的文本被传输。如果你担心这个,你可使用压缩协议(MySQL3.22和以上版本)使事情变得更难。甚至为了使一切更安全,你应该安装ssh。用它,你能在一个MySQL服务器与一个MySQL客户之间得到一个加密的tcp/ip连接。
为了使一个MySQL系统安全,强烈要求你考虑下列建议:
对所有MySQL用户使用口令。记住,如果other_user没有口令,任何人能简单地用Mysql -u other_user db_name作为任何其它的人登录。对客户机/服务器应用程序,客户可以指定任何用户名是常见的做法。在你运行它以前,你可以通过编辑MySQL_install_db脚本改变所有用户的口令,或仅仅Mysql root的口令,象这样:
shell> mysql -u root mysql mysql> up�ate user
set password=password("new_password")
wh�re user="root"; mysql> flush privileges;

不要作为Unix的root用户运行MySQL守护进程。mysqld能以任何用户运行,你也可以创造一个新的Unix用户MySQL使一切更安全。如果你作为其它Unix用户运行mysqld,你不需要改变在user表中的root用户名,因为Mysql用户名与unix 用户名没关系。你可以作为其它unix用户编辑mysql.server启动脚本mysqld。通常这用su命令完成。

如果你把一个Unix root用户口令放在mysql.server脚本中,确保这个脚本只能对root是可读的。
检查那个运行Mysqld的Unix用户是唯一的在数据库目录下有读/写权限的用户。

不要把process权限给所有用户。mysqladmin processlist的输出显示出当前执行的查询正文,如果另外的用户发出一个up�ate user set password=password("not_secure")查询,被允许执行那个命令的任何用户可能看得到。mysqld为有process权限的用户保留一个额外的连接, 以便一个mysql root用户能登录并检查,即使所有的正常连接在使用。不要把file权限给所有的用户。

有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了使这更安全一些,用sel�ct ... into outfile生成的所有文件对每个人是可读的,并且你不能覆盖已经存在的文件。
file权限也可以被用来读取任何作为运行服务器的unix用户可存取的文件。这可能被滥用,例如,通过使用load data装载“/etc/passwd”进一个数据库表,然后它能用sel�ct被读入。

如果你不信任你的dns,你应该在授权表中使用IP数字而不是主机名。原则上讲,--secure选项对mysqld应该使主机名更安全。在任何情况下,你应该非常小心地使用包含通配符的主机名。
Tags:
Jul 30
当您面临JSP连接MySQL数据库问题,你首先需要在MySQL数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数据。

以下用两种方式来实现JSP连接MySql数据库

第一种方式,用JSP实现:

<%@ page contentType="text/html;
charset=gb232" language="java"
import="java.sql.*"%>
<meta http-equiv="Content-Type" content="text/html; charset=gb232">
<%//*******************************
****************
JDBC_ODBC连接MySql数据库,不需要设置数据源***********
**********************/  
//********** 数据库连接代码 开始 ******/  
//以下几项请自行修改String server="localhost";        
//MYSQL 服务器的地址String dbname="test";          
//MYSQL 数据库的名字String user="root";                
//MYSQL 数据库的登录用户名String pass="chfanwsp";            
//MYSQL 数据库的登录密码String port="3306";    
//SQL Server 服务器的端口号,
默认为433//数据库连接字符串
String url ="jdbc:mysql://"+server+":"+port+"/"+dbname+"?
user="+user+"&amp;password="+pass+"&amp;useUnicode
=true&amp;characterEncoding=GB232";
//加载驱动程序Class.forName("org.gjt.mm.mysql.Driver").newInstance();
//建立连接Connection conn= DriverManager.getConnection(url);
//创建语句对象Statement stmt=conn.cr&amp;#0;ateStatement
(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
// ****     数据库连接代码 结束 *******  
  String sql="sel&amp;#0;ct * from username";
ResultSet rs=stmt.executeQuery(sql);
//rs.first();while(rs.next()){out.print("用户名:");
out.print(rs.getString("uid")+" 密码:");
out.println(rs.getString("pwd")+"<br>");}
rs.close();stmt.close();conn.close();%>

第二种方式,用JavaBean来实现:

DBConnMySql.java编译以后的Class文件应该放在WEB-INF\classes\conn目录下。

package conn;    //导入包import java.sql.*;        
//导入数据库操作的类public class DBConnMySql            
//构造方法,初始化{private Connection conn;        
//连接对象private Statement stmt;    
//语句对象private ResultSet rs;    
//结果集对象private String MySqldriver;
//MYSQL Server驱动程序字符串private String MySqlURL;
//MYSQL Server连接字符串//*********************************
用  og.gjt.mm.mysql.Driver 驱动
*  该方法取得连接所需各种参数,组成连接字符串,
然后再建立连接*  server;dbname,user,pass,port
分别表示MYSQL 服务器的地址,
*  数据库,用户名,密码,端口
**********************************/
public Connection getConnToMySql
(String server,String dbname,String user,String pass,String port)
{//MYSQl驱动程序MySqldriver = "org.gjt.mm.mysql.Driver";    
MySqlURL = "jdbc:mysql://";          
//连接字符串一部分try{//完整的连接字符串MySqlURL
=MySqlURL+server+":"+port+"/"+dbname+"?user=
"+user+"&password="+pass+"&useUnicode
=true&characterEncoding=GB232";
Class.forName(MySqldriver);conn
= DriverManager.getConnection(MySqlURL);}
catch(Exception e){System.out.println
("操作数据库出错,请仔细检查");
//System.err.println(e.getMessage());}return conn;}    
//关闭数据库连接public void close(){try{//rs.close();
//stmt.close();conn.close();}catch(SQLException
sqlexception){sqlexception.printStackTrace();}}}

这个文件只是实现了数据库的连接,下面再写一个测试文件,就是用SQL语句从数据库里查询出记录,以验证我们数据库的连接是否成功。

connmysql.jsp文件源代码如下:

<meta http-equiv="Content-Type" content="text/html;
charset=gb232"><%@ page contentType="text/html;
charset=gb232" language="java" import="java.sql.*"  %>
<jsp:useBean id="DBConn" scope="page" class="conn.DBConnMySql"/>
<% //以下几项请自行修改String server="localhost";        
//MYSQL 服务器的地址String dbname="test";      
//MYSQL 数据库的名字String user="root";            
//MYSQL 数据库的登录用户名String pass="chfanwsp";        
//MYSQL 数据库的登录密码String port="3306";          
//SQL Server 服务器的端口号,默认为433Connection
conn=DBConn.getConnToMySql
(server,dbname,user,pass,port);
Statement stmt=conn.cr&amp;#0;ateStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String sql="sel&amp;#0;ct * from username";
String sql="ins&amp;#0;rt into username (uid,pwd) values
('梦想年华','梦想年华')";stmt.executeUp&amp;#00;ate(sql);
ResultSet rs=stmt.executeQuery(sql);while(rs.next())
{out.print("用户名:");out.print(rs.getString("uid")+" 密码:");
out.println(rs.getString("pwd")+"<br>");}
//rs.close();//stmt.close();//conn.close();DBConn.close();%>
Tags: ,
分页: 5/8 第一页 上页 1 2 3 4 5 6 7 8 下页 最后页 [ 显示模式: 摘要 | 列表 ]