Tinko

@Tinko3年前

2016-06-29
12:13
Tinkoの日常

晨光BT转移到NexusPHP 迁移记录

学校的PT站之前是老师找了北交的知行帮忙搭建的晨光BT,但是我最后用的时候,感觉不是很合理,比如说什么找不到封禁用户啊,版主删不了自己的种子啊,新手审核取消不掉啊,诸如此类乱七八糟的。

然后也不知道怎么的心一横,我就决定要迁移PT站,可能当时也是心想趁着现在没多少人吧……规模不大迁移起来比较快。

第一步自然是导出数据库了,奈何命令行不是很会用,于是直接用phpMyAdmin导出。最后导出的数据库中,实际使用的数据表只有这几张

cgbt_torrents
cgbt_torrents_attachments
cgbt_torrents_descr
cgbt_torrents_files
cgbt_torrents_id
cgbt_torrents_images
cgbt_torrents_index
cgbt_torrents_keywords
cgbt_torrents_mod
cgbt_users
cgbt_users_bans
cgbt_users_stat

在转移的时候我没有考虑字幕的转移……好吧这可以算是一个失误。

导出之后就建立一个NexusPHP的站点咯,这倒没什么好说的。

然后在新的服务器上建立一个数据库,并将上面导出的数据表导入到这个数据库中。在转移数据库的时候我都是写了一个php然后批量转……如果有什么更简便的办法还请告诉我……

接下来首先处理users表。对于晨光BT而言,用户数据是分散在好几个表中的,而NexusPHP都是集中在一起。同时,晨光的时间格式是int型的UNIX时间戳,而NexusPHP都是年月日时分秒这种。首先在晨光BT中读出所有用户数据。

SELECT 
`cgbt_users`.`uid`, 
`cgbt_users`.`username`, 
`cgbt_users`.`email`, 
`cgbt_users`.`passkey`,  
from_unixtime(`cgbt_users_stat`.`last_login`) AS `last_login` , 
from_unixtime(`cgbt_users_stat`.`last_access_both`) AS `last_access_both`,  
`cgbt_users_stat`.`last_ipv6`, 
`cgbt_users_stat`.`uploaded`, 
`cgbt_users_stat`.`downloaded`, 
`cgbt_users_stat`.`extcredits1`, 
from_unixtime(`cgbt_users_stat`.`createtime`) AS `createtime` 
FROM 
`cgbt_users` 
LEFT JOIN 
`cgbt_users_stat` 
ON  
cgbt_users.uid=cgbt_users_stat.uid

将查询结果甩进一个数组,然后foreach执行下面的插入查询

INSERT INTO 
`users`(`id`,`username`,`passhash`,`secret`,`email`,`status`,`added`,`last_login`,`last_access`,
`last_home`,`last_offer`,`forum_access`,`last_staffmsg`,`last_pm`,`last_comment`,`last_post`,
`last_browse`,`last_music`,`last_catchup`,`editsecret`,`privacy`,`stylesheet`,
`caticon`,`fontsize`,`info`,`acceptpms`,`commentpm`,`ip`,`class`,`max_class_once`,
`avatar`,`uploaded`,`downloaded`,`seedtime`,`leechtime`,`title`,`country`,`notifs`,
`modcomment`,`enabled`,`avatars`,`donor`,`donated`,`donated_cny`,`donoruntil`,`warned`,
`warneduntil`,`noad`,`noaduntil`,`torrentsperpage`,`topicsperpage`,`postsperpage`,`clicktopic`,
`deletepms`,`savepms`,`showhot`,`showclassic`,`support`,`picker`,`stafffor`,`supportfor`,
`pickfor`,`supportlang`,`passkey`,`promotion_link`,`uploadpos`,`forumpost`,`downloadpos`,
`clientselect`,`signatures`,`signature`,`lang`,`cheat`,`download`,`upload`,`isp`,`invites`,
`invited_by`,`gender`,`vip_added`,`vip_until`,`seedbonus`,`charity`,`bonuscomment`,`parked`,
`leechwarn`,`leechwarnuntil`,`lastwarned`,`timeswarned`,`warnedby`,`sbnum`,`sbrefresh`,
`hidehb`,`showimdb`,`showdescription`,`showcomment`,`showclienterror`,`showdlnotice`,`tooltip`,
`shownfo`,`timetype`,`appendsticky`,`appendnew`,`appendpromotion`,`appendpicked`,`dlicon`,
`bmicon`,`showsmalldescr`,`showcomnum`,`showlastcom`,`showlastpost`,`pmnum`,`school`,`showfb`,
`page`,`MODEMAX`,`addbonus`,`gotgift`,`bjwins`,`bjlosses`,`namecolour`,`qq`,`seedbonusper`,
`logouttime`,`addbonusday`,`deancheck`,`hrwarned`)
VALUES
(:id,:username,'needupdate','needupdate',:email,'confirmed',:regtime,:lastlogin,:lastaccess,
'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00',
'0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','0','0','0','','normal','1',
'1','medium','','yes','yes',:lastip,'1','1','',:uploaded,:downloaded,'0','0','','8','','',
'yes','yes','no','0.00','0.00','0000-00-00 00:00:00','no','0000-00-00 00:00:00','no',
'0000-00-00 00:00:00','0','0','0','firstpage','yes','yes','yes','yes','no','no','','','','',
:passkey,'','yes','yes','yes','0','yes','','25','0','0','0','0','0','0','N/A','no',
'0000-00-00 00:00:00',:bonus,'0.0','','no','no','0000-00-00 00:00:00','0000-00-00 00:00:00',
'0','0','20','30','no','yes','yes','yes','no','1','off','yes','timealive','yes','yes','icon',
'yes','yes','yes','yes','yes','no','no','10','0','yes','','0','0','0','0','0','','0','0.00','0',
'0','','0')

完成之后,用户可以通过找回密码的方式将密码重置。因为时间的关系,并没有仔细检查是否有无缝转移密码的方法。转移之后所有用户都是新注册的等级,如果需要迁移用户组等级的话,还需要在晨光导出的时候提取用户组别。

这里还有个种子文件的转换问题。晨光的种子文件存放方式是在torrents文件夹下按年月建立文件夹进行存放,而在数据库中记录文件位置的形式是相对路径的字符串,而Nexus是在torrents文件夹下以种子ID的形式直接存放。这样又要重命名一大堆文件了。首先提取出每个种子的ID和种子文件路径:

SELECT `id`,`filename` FROM `cgbt_torrents`

所有种子数据甩进数组,之后foreach执行下面的命令:

cp /usr/share/nginx/html/torrents/数组中文件名字段 /usr/share/nginx/html/torrents/种子ID.torrent

种子文件到位之后就可以着手转移种子信息了。对于种子信息,我们需要左连接三张表,简直酸爽。

SELECT 
`cgbt_torrents`.`id`,
`cgbt_torrents`.`uid`,
`cgbt_torrents`.`name`,
from_unixtime(`cgbt_torrents`.`createtime`) AS `createtime`,
from_unixtime(`cgbt_torrents`.`updatetime`) AS `updatetime`,
`cgbt_torrents`.`save_as`,
`cgbt_torrents`.`files`,
`cgbt_torrents`.`size`,
`cgbt_torrents_descr`.`descr`,
`cgbt_torrents_index`.`download`,
`cgbt_torrents_index`.`complete`,
`cgbt_torrents_index`.`view` 
FROM 
(
  `cgbt_torrents` 
  LEFT JOIN 
  `cgbt_torrents_descr` 
  ON 
  `cgbt_torrents`.`id` = `cgbt_torrents_descr`.`tid`
) 
LEFT JOIN 
`cgbt_torrents_index` 
ON 
`cgbt_torrents`.`id` = `cgbt_torrents_index`.`id`

老规矩,丢数组,foreach跑下面的查询:

INSERT INTO `torrents`
(`id`,`info_hash`,`name`,`filename`,`save_as`,`descr`,`small_descr`,`ori_descr`,`category`,
`source`,`medium`,`codec`,`standard`,`processing`,`team`,`audiocodec`,`size`,`added`,`type`,
`numfiles`,`comments`,`views`,`hits`,`times_completed`,`times_uncompleted`,`leechers`,
`seeders`,`last_action`,`visible`,`banned`,`owner`,`nfo`,`sp_state`,`promotion_time_type`,
`promotion_until`,`anonymous`,`url`,`pos_state`,`cache_stamp`,`picktype`,`picktime`,
`last_reseed`,`urltype`,`havenoseed`,`nobuymoney`,`quality`,`editdate`,`subcount`,`rating`)
VALUES
(:id,:md5,:name,:fname,:save_as,:descr,:shortdescr,:oridesc,'409','0','0','0','0','0','0',
'52',:size,:addedtime,'multi',:filesnum,'0',:views,:hits,:timescompleted,:timesuncompleted,
'0','0',:lastreseed,'yes','no',:owner,'','1','0','0000-00-00 00:00:00','no','0','normal','0',
'normal','0000-00-00 00:00:00',:lastreseed,'2','no','yes','pend',:addedtime,'subcount','0.0')

原以为一切顺利,谁知道跑起来报错SQL 930……没见过啊?!?!
然后我把查询输出一遍,结果……查询被截断了……
在Goo查了半天之后,居然又回到了最初的地方,php官网。php官网上面pdo的文档下方评论有人提到了在初始化连接的时候通过传递参数array(PDO::MYSQL_ATTR_MAX_BUFFER_SIZE => 1024 * 1024 * 1024 * 50)来扩大其缓冲区。
加上这个参数之后……完美……

啊对了,如果发现有中文乱码的话,记得要在pdo连接的时候带参数charset=utf8
以上,完结…………??
等等,附件呢?
图片附件反正是用的img1域名链接的,暂时还没转,只要别取消img1域名解析就成了……让它去吧……

晨光BT转移到NexusPHP 迁移记录