MySQL大数据库的导出和导入

phpmyadmin是一件很方便的在线管理MySQL数据库的工具,但对于较大的数据库的导出和导入却显得力不从心。特别是导入工作,通常2M已经是它的极限了。

这时用MySQL的原生工具就能很好地解决这些问题了。

假设我们要对一个名为blog的数据库进行导出和导入的操作

导出

mysqldump -u数据库用户名 -p密码 blog > 路径/导出名.sql

具体的操作是这样的,打开命令提示符(这里都以Windows系统为例),进入mysql安装所在目录中的bin文件夹(因为我的mysql没有安装为本地服务,所以要进行这一步),最后输入运行上面的那条命令即可。

导入

mysql -u数据库用户名 -p密码 blog < 路径/数据库名.sql

操作如上,用命令提示符进入bin文件夹后,输入运行该命令即可。

不是什么新奇的技术,只是做个记录,利于日后的参考。 :mrgreen:

二零零八总结与二零零九展望

二零零九年已经来到,又是时候对过去的一年做一个总结了。
当然,自然少不了对二零零九年来个展望啦。(希望自己能做到吧 :???:

二零零八年发布文章数:107

数量比上一年有了明显的提高,但自己感觉还是少了点,所以希望接下来的二零零九年能发布更多的文章。

#对应的得到2008年发布文章数的SQL语句
SELECT COUNT( * )
FROM `wp_posts`
WHERE post_date >= '2008-01-01'
AND post_date < '2009-01-01'
AND post_type = 'post'
AND post_status = 'publish'

收到的留言(包括trackback与pingback):940

得益于国人在WordPress留言系统上的改进与提高,留言数有了很大的提高。(当然冰古自己的留言都占了一大部分 :mrgreen:
二零零九年的希望当然是越多越好啦 :smile: (这个任务希望大家帮帮忙)

#对应的得到2008年收到留言总数的SQL语句
SELECT COUNT( * )
FROM `wp_comments`
WHERE comment_date >= '2008-01-01'
AND comment_date < '2009-01-01'
AND comment_approved =1

二零零八年发表并收到留言数量前十的文章:

  1. godaddy域名超级优惠码 → 留言数:38
  2. WordPress中用Ctrl+Enter提交留言 → 留言数:37
  3. 《命令与征服:红色警戒3》电驴下载 → 留言数:29
  4. 《归来!悟空和他的朋友们》QQ中转站下载 → 留言数:26
  5. 博客接龙大赛:Wordpress十八摸 → 留言数:25
  6. 长见识啊 → 留言数:25
  7. Gmail邮件小表情 → 留言数:25
  8. 常驻我电脑的国产软件 → 留言数:24
  9. WordPress主题:Simple.1 → 留言数:19
  10. 使用Netbeans开发WordPress → 留言数:19
#对应的收到留言最多的文章的SQL语句
#wordpress 2.7适用,其他版本未测试
#如不能使用,可以参考:http://bingu.net/425/some-sql-for-2006-blog-stats/
SELECT `ID`, `post_date`, `post_title`, `comment_count`, `post_name`
FROM `wp_posts`
WHERE post_date >= '2008-01-01'
AND post_date < '2009-01-01'
AND post_type = 'post'
AND post_status = 'publish'
ORDER BY `wp_posts`.`comment_count` DESC

附上使用GaMerZ WP-PostViews插件的查看数最多统计SQL语句:

SELECT DISTINCT meta_value, ID, post_title, post_name, post_date, comment_count
FROM `wp_posts` , `wp_postmeta`
WHERE post_id = ID
AND post_date >= '2008-01-01'
AND post_date < '2009-01-01'
AND post_type = 'post'
AND post_status = 'publish'
AND meta_key = 'views'
ORDER BY cast( `meta_value` AS DECIMAL ) DESC

最后,感谢各位的留言支持:
最勇猛的五位兄弟(姐妹?)是

  1. wayne → 留言数:25
  2. Donald → 留言数:24
  3. Yacca → 留言数:19
  4. iColor → 留言数:18
  5. JoBru → 留言数:18
#对应留言最多的SQL语句
SELECT DISTINCT concat( '<a href="', comment_author_url, '">', comment_author, '</a>' ) , count( comment_author ) AS num_author
FROM `wp_comments`
WHERE comment_date >= '2008-01-01'
AND comment_date < '2009-01-01'
AND comment_author != '冰古'#去掉自己吧
AND comment_type != 'trackback'
AND comment_type != 'pingback'
AND comment_approved =1
GROUP BY comment_author, comment_author_email
ORDER BY num_author DESC

用YUM升级CentOS系统中PHP和MySQL

用上umVPS后,很多时候在虚拟主机不用自己动手的事情都要自己搞定了,例如:PHP和MySQL的升级。因为不用自己动手,也动不了,所以冰古不太清楚虚拟主机的PHP和MySQL是不是会及时地更新。但用VPS,可以动手玩一下也保证安全,冰古是很乐意进行更新的。以下就是用YUM升级CentOS系统中PHP和MySQL的过程:

yum是CentOS系统自带的用于方便地添加/删除/更新RPM包的工具,它能自动解决包的倚赖性问题。
用yum更新PHP,只需用一条命令就可以搞定:

#yum update php

但问题来了,使用此命令后,系统告诉我,没有发现可更新的包。而当前的PHP版本只是5.2.1,PHP官方已经更新到5.2.6了。
经过一番询问,才知道原来CentOS系统的源里PHP仍旧是5.2.1,需要额外的源才能升级PHP。
根据外国网友的介绍,冰古添加了额外的源
登录SSH后依次运行下列命令:

#rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
#vi /etc/yum.repos.d/utterramblings.repo #文中这里是使用nano,但VPS不能启动nano,用vi代替也是可以的

在打开的文档中加入下面内容:

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

保存。
再次运行下面的命令就可以完成php的升级了

#yum update php

同理,运行下面命令,升级mysql

#yum update mysql

latin1_swedish_ci to utf8_general_ci

从旧主机搬到新主机最烦人的就是乱码问题。这也是个由来已久的问题了。
wordpress 2.2开始,wordpress提供DB_CHARSET和DB_COLLATE这两个参数以便我们更好地解决这个问题。但似乎这些并不够,仍旧会产生这样那样的问题,如Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\wordpress\wp-includes\classes.php on line 88。最根本的解决应该还是把数据库里的数据由latin1_swedish_ci格式转换成utf8_general_ci格式。
wordpress官方的论坛就像wordpress那样,很有人气。你遇到的问题,很可能里面已经有人讨论过并已经解决了。乱码问题这个很热门的问题,当然也是完美地解决了地。
以下方法涉及数据库修改,请在备份数据库后操作!
解决的方法是这样的:
1. 下载g30rg3_x提供的这个plugin;
2. 确保你的wordpress是2.2.x或2.1.x,因为这个plugin只支持这两个系列的版本;
3. 上传到plugins文件夹并激活;
4. 到’UTF-8 Database Converter’菜单中按照提示进行剩余操作即可。

上面的办法多了不少的限制,如wordpress的版本需是2.2.x或2.1.x,并能保证你的wordpress还能登录!(是的,很可能你的wordpress这时已经不能登录了。)
这时我们可以借用一下g30rg3_x提供的UTF8_DB_Converter_DoIt()函数:

<?php
define('DB_NAME', 'putyourdbnamehere');    // 数据库名
define('DB_USER', 'usernamehere');     // MySQL用户名
define('DB_PASSWORD', 'yourpasswordhere'); // 密码
define('DB_HOST', 'localhost');    // 很大可能你无需修改此项
function UTF8_DB_Converter_DoIt() {
$tables = array();
$tables_with_fields = array();
// Since we cannot use the WordPress Database Abstraction Class (wp-db.php),
// we have to make an a stand-alone/direct connection to the database.
$link_id = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die('Error establishing a database connection');
mysql_select_db(DB_NAME, $link_id);
// Gathering information about tables and all the text/string fields that can be affected
// during the conversion to UTF-8.
$resource = mysql_query("SHOW TABLES", $link_id);
while ( $result = mysql_fetch_row($resource) )
$tables[] = $result[0];
if ( !empty($tables) ) {
foreach ( (array) $tables as $table ) {
$resource = mysql_query("EXPLAIN $table", $link_id);
while ( $result = mysql_fetch_assoc($resource) ) {
if ( preg_match('/(char)|(text)|(enum)|(set)/', $result['Type']) )
$tables_with_fields[$table][$result['Field']] = $result['Type'] . " " . ( "YES" == $result['Null'] ? "" : "NOT " ) . "NULL " .  ( !is_null($result['Default']) ? "DEFAULT '". $result['Default'] ."'" : "" );
}
}
// Change all text/string fields of the tables to their corresponding binary text/string representations.
foreach ( (array) $tables as $table )
mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET binary", $link_id);
// Change database and tables to UTF-8 Character set.
mysql_query("ALTER DATABASE " . DB_NAME . " CHARACTER SET utf8", $link_id);
foreach ( (array) $tables as $table )
mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8", $link_id);
// Return all binary text/string fields previously changed to their original representations.
foreach ( (array) $tables_with_fields as $table => $fields ) {
foreach ( (array) $fields as $field_type => $field_options ) {
mysql_query("ALTER TABLE $table MODIFY $field_type $field_options", $link_id);
}
}
// Optimize tables and finally close the mysql link.
foreach ( (array) $tables as $table )
mysql_query("OPTIMIZE TABLE $table", $link_id);
mysql_close($link_id);
} else {
die('<strong>There are no tables?</strong>');
}
return true;
}
UTF8_DB_Converter_DoIt();
?>

现在你把上面代码保存到一个php文件中,上传至空间并运行,如无意外你的数据已经完成了latin1_swedish_ci到utf8_general_ci转换。

Dreamhost自动备份mysql

在查找“用SSH备份mysql”时,发现的——“Dreamhost下每天自动备份mysql数据库,并发送到指定邮箱”。
觉得比wordpress的一些备份plugin好,决定启用。

1、用putty登录你的dreamhost;
2、运行

cd ~
mkdir backups
mkdir backups/archives

3、新建一个名为“mysql.sh”的文件,并输入下列代码:

#!/bin/bash
cd /home/username/backups/ #username改为你登录ssh时用的用户名
mkdir mysql
suffix=$(date +%y%m%d)
mysqldump --opt -uUser -pPass -h mysqlA.domain.com db_nameA > mysql/db_nameA.$suffix.sql #User为数据库用户名,pass为数据库用户密码,mysqlA.domain.com为数据库地址,db_nameA为数据库名,请根据你的情况修改。
tar zcf archives/mysql_backup.$suffix.tar.gz mysql/*
rm -r mysql/
mutt you@domain.com -a /home/username/backups/archives/mysql_backup.$suffix.tar -s "MySQL Backup" #you@domain.com修改为你准备用于收取备份压缩包的邮箱。

保存后,上传到backups文件夹中。
4、在putty中运行

dos2unix ~/backups/mysql.sh
chmod 755 ~/backups/mysql.sh

5、在Dreamhost的panel,Goodies->Cron Jobs中新建Cron任务,选项设置为
Command to run: /home/User/backups/mysql.sh
#User改为你登录SSH时用的用户名。
时间照下图设置,将在北京时间每天的24:10左右运行备份MySQL程序,并发送备份压缩包到你指定的邮箱。
cron time setting
6、完成!

参考文献:wiki.dreamhost.com
Green Web Hosting! This site hosted by DreamHost.

wordpress导入后出现乱码之解决

昨天下了wamp5,准备再好好学学PHP和玩一下wordpress。
没想到一来就弄个麻烦的~从空间上备份的数据,导入到本地数据库后,竟然是一堆乱码(形如:????),自己是搞鼓了一整天(试了几乎所以相关的utf8编码都是不行)也是没搞定。
自己搞不定就找人问吧。来到海豚在google论坛上建的论坛上发言,下午海豚告诉我在苛世录上可找到解决办法,跟去→桑林志Windix’s Weblog阿修的部落格
原因是:

从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章”Character Set Support“后终于找到了解决方法并测试通过。

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';

解决办法是:
一、导入数据时,新建的数据库collation (校勘/整理)项选择为utf8_general_ci;
二、修改wp-includes/wp-db.php为

$this->dbh = @mysql_connect($dbhost,$dbuser,$dbpassword);
//加上下面這行
$this->query("SET NAMES 'utf8' ");

至此,问题解决。