标签 mysql 下的文章

事因手误安装的时候敲错了路径,发现的时候大部分环境已经部署好了,需要在安装之后修改路径

以下备忘是lnmp的,其他安装方式类似,重点在标红的步骤

1.停止服务

lnmp stop mysql

如果是手动安装,用 systemctl stop mysql

2.复制库文件到新的目标路径

cd /homw
cp -a -r db /home/db
mv db db_bak

这里就是问题所在(掩面)手抽筋把 home 敲成 homw 了...
重点就在这里 cp -a -r 必须加上 -a 确保目录权限也复制
最后的mv 改名只是为了把原路径改掉,确认路径被修改后是否生效,避免下一步修改配置错误依然从原目录存取但未能发现问题

3.修改配置文件

vi /etc/my.cnf

若非lnmp安装这个配置文件可能不是这个路径或名字,根据实际情况而定
把相关的 datadir, innodb_data_home_dir, innodb_log_group_home_dir 等选项修改为新路径

4.重启mysql服务

lnmp restart mysql

如无报错修改完成,观察一段时间无问题后可以把原路径的 db_bak 删除。

数据库中某字段的部分内容有问题需要更正,由于业务已经上线由用户数据在内不方便重新导入。但如果手动逐条修改的话会累死个人。

查了下直接用 mysql 内建的字符串函数 replace() 可以解决问题,手册说明如下

REPLACE(str,from_str,to_str) 

Returns the string str with all occurrences of the string from_str replaced by the string to_str. REPLACE() performs a case-sensitive match when searching for from_str. 

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'
This function is multi-byte safe. 

用法不复杂,和php /js内的方法相似

以下是执行替换的sql

UPDATE `quiz_question` SET `question`= REAPLCE(`question`, ' ', '_');

嗯,是的,就是把空格替换成下划线,因为显示在html中空格会被忽略掉,导致填空位置显示不清晰。

一句sql省下用python/php 取出来再重新写入的功夫。
PEACE!

一个比较特殊的需求,要把某个表的内容复制3倍量
把每一条记录拆分成 ABC三份(名字后缀增加ABC后缀区分,名字字段是唯一索引)

首先确定了原表有325行,id最大一行值为 326


//保险起见先备份原表(其实并不是必须)
CREATE TABLE `mTable_bak` LIKE `mTable`;
INSERT INTO `mTable_bak` SELECT * FROM `mTable`;

//复制成分身B
INSERT INTO `mTable`(`shequ`, `name`, `addr`, `wuguan`, `contact`, `contactphone`) 
SELECT `shequ`, CONCAT(`name`,'B'), `addr`, `wuguan`, `contact`, `contactphone` 
FROM `mTable` 
WHERE `id` <= 326;

//复制成分身C
INSERT INTO `mTable`(`shequ`, `name`, `addr`, `wuguan`, `contact`, `contactphone`) 
SELECT `shequ`, CONCAT(`name`,'C'), `addr`, `wuguan`, `contact`, `contactphone` 
FROM `mTable` 
WHERE `id` <= 326;


//最后改变原来的数据加上 A后缀
UPDATE `xiaoqu` SET `name`=CONCAT(`name`,'A') WHERE `id` <= 326;

越忙越见鬼,遇到奇怪的东西,实在吊诡。

php和mysql和phpmyadmin都未曾改动或升级,已使用一年有多。
今天登录 phpmyadmin 账号管理页面顶部提示

You do not have privileges to manipulate with the users!

看首页右侧登录信息,确认是 root账号没错,不过显示的是 root@ 而不是 root@localhost

QQ截图20200702235006.jpg

(截图不能重现)

注销重新登录无效;
重启 LNMP服务无效;
换浏览器登录无效;
尝试根据一些别人的文章去修改设置,也没有得到预期的效果(更糟了,部分库变得不能访问,还好有备份赶紧还原)。

ssh上服务器用命令行进mysql 执行账号操作,被提示 grant 操作不支持

The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

又查了一下别人的解决办法,用下面的命令解决(但似乎无关)

mysql> flush privileges;

后来发现更诡异的事情,视乎我用错误的账号和密码都可以登录.
额——

于是去查看最初的备忘,发现这个数据库的初始密码确实不是常用的,也无从考究最初是谁部署的
用正确的密码登录...发现一切都好了

难道问题只是因为浏览器的cookie登录,导致的权限问题? 不得而知
法克!讨厌这种绕了一大圈问题消失了而不是解决了的便秘感。


参考文

备忘,当对一个有唯一索引字段的表做插入操作INSERT INTO 时做遇到冲突则更新的逻辑ON DUPLICATE KEY UPDATE
想知道此时是否仍然能够获取到 操作的行的id值db.lastrowid

sql = "INSERT INTO `mTable`(`id`, `tfsn`)  " \
          "VALUES(%s, %s) " \
          "ON DUPLICATE KEY UPDATE `tfsn`=VALUES(`tfsn`);"

vals = (id, tfsn)

try:
    db.execute(sql, vals)

    new_cid = db.lastrowid
    print("tfid:", tfid) #如果触发了update 可以获得id值?

结论是,能,也可能不。
当触发update 有内容变更时,可以获得 id值;
当update的内容新旧完全一致前后没有变化的话,mysql会认为没有任何行被更新。所以返回的 id 会是0