昨天单位由一个网站,要放到万网的虚拟主机去。
网站是jsp写的,程序好导。直接ftp过去就可以了。
可是mysql的数据库怎么导呢?
我先用
mysqldump database_name>database_name.sql
然后把这个database_name.sql下载下来。
再给虚拟主机空间上传一个phpmyadmin来做数据库管理用。这样就可以使用phpmyadmin导入数据了。
如果网站数据小,这样就ok了。可是我的database_name.sql有60M
万网空间上的phpmyadmin只能{zd0}支持2M
于是只能另外想办法。我先导入表格结构吧。
mysqldump –d database_name>database_name.sql
在phpmyadmin里,选择好数据库后,用导入功能,将database_name.sql导入
现在有了表结构了,但是每个表都没有数据。我们再继续导入数据。
我的表里面,除了一个news表格特别大,大约51M,其他都在2M一下。所以我每个表格生成一个txt文件,然后导入到万网的数据库。
本地进入mysql>提示符后,用以下命令将数据的表格数据导出。
select * from admin into outfile “/tmp/admin.txt” fields terminated by “|” lines terminated by “@”;
上面命令将本地数据库的admin表,导出到/tmp/目录下的admin.txt文件。
我们有几个表格,就用这个命令导出几个txt文件。
然后将txt文件用gzip压缩,因为phpmyadmin支持gzip压缩格式的。
cd /tmp/
gzip admin.txt
{zh1}将压缩的admin.txt.gz下载到本地,用浏览器上传给phpmyadmin导入
解决news表格过大问题
我的news表格有51M,就算gzip压缩后,还有7M左右,还是不能用phpmyadmin导入。
我们可以将news表格的数据切分为多个txt文件,然后保证每个文件gzip后,在2M以内就可以。
这个切分就要根据具体表格来判断了。
我先查询了news表格一共有多少条记录
select count(*) from news;
返回1477条,表格是51M。压缩后的表格是7M。
7M/2M=3.5
1477/3.5=422条。
根据上面的计算,只要按照422条一个文件来分割就可以了。为了保险,因为每条记录的大小并不是一样的平均分配,我按照每个文件200条记录来切分。
select * from news where newId>0 limit 200 into outfile “/tmp/news0.txt” fields terminated by “|” lines terminated by “@”;
然后用
select max(newId) from news where newId>0 limit 200;
查看下200条记录后,是到了那条记录,下次分割就从那条开始
这样分割出来的8个文件,一次压缩后,上传到phpmyadmin导入。就完成了全部表格的导入工作。
总结
其实如果数据本身不复杂,直接用navicat也可以远程连接导入的。但是navicat不支持定义 lines terminated。我的news表格里面存在的都是html代码,经常出现换行符,所以只能选择用phpmyadmin了。
要想记录下提交到mysql数据库的全部sql语句,可以通过修改my.cnf来实现
修改/etc/my.cnf文件
找到
[mysqld]段
加入
log=queryLog
log-slow-queries=showquerylog
然后就可以到/var/lib/mysql/目录下找到queryLog和showquerylog日志文件了
里面记录这每个提交到数据库执行的sql语句。
我的系统CentOS 4.4 rpm方式安装的mysql 5.0.57,如果其它系统或者其它安装方式,可能文件路径会有些不同。
建立Mysql两个表间的外键,需要满足三个条件
1.两个表必须是InnoDB表类型
2.使用在外键关系的域必须为索引型(Index)
3.使用在外键关系的域必须与数据类型相似
下面举例说明
我们创建一个班级表和一个学生表,并建立一个外键
创建班级表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINE=INNODB;
插入班级数据
INSERT INTO class VALUES (1,"一班"),(2,"二班"),(3,"三班");
创建学生表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, INDEX (FK_class), FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id)) ENGINE=INNODB;
验证外键约束性,我们向students表插入一个学生数据,并让FK_class的值为一个在class表里面不存在的值.
mysql> INSERT INTO students VALUES (1,"zhang",5);
马上就会看到Mysql报错
ERROR 1452 : Cannot add or update a child row: a foreign key
constraint fails (`test/students`, CONSTRAINT `students_ibfk_1`
FOREIGN KEY (`FK_class`) REFERENCES `class` (`id`))
以上证明外键可以正常工作了
在Mysql下测试了以下,不建立index,并且不指定innodb格式.
版本
+----------------------+
|
version()
+----------------------+
| 5.0.24a-community-nt |
+----------------------+
建立class表
CREATE TABLE class (id INT NOT NULL AUTO_INCREMENT, classname VARCHAR(50) NOT NULL, PRIMARY KEY(id));
建立students表
CREATE TABLE students (id INT(4) NOT NULL, name VARCHAR(50) NOT NULL, FK_class INT(4) NOT NULL, FOREIGN KEY (FK_class) REFERENCES class (id), PRIMARY KEY(id));
通过Navicat查看,上面语句建立的两个表,也会默认用INNODB存储,而且也在students表建立了index和外键.一切正常.
已投稿到: |
|
---|