分类 数据库 下的文章

这周技术部出了一个数据库题给大家做,自己做这个题也补习了一些知识。

#group_concat 多行的列结果合并到一行 , 结合 group by userid 达到 。
#concat_ws 可以指定符号的字符串(列合并)连接,本例中用 - 连接 省 市 区 ,多个地区之间用默认的逗号。
#find_in_set 用于代替in查询 , in查询在子查询表达式中,如果in的其中一个数据为null,不管其它条件是否有数据,整个表达式的结果就是null,在此使用find_in_set替代。
#子查询中或通过substring处理后的值,in还有可能只返回第一个而非全部。

select companyid as 公司编号 ,userid as 用户编号 ,group_concat( (select concat_ws('-', (select group_concat(b.areaname separator '-') from area b where  find_in_set (b.areaid,a.arrparentid)),a.areaname) from area a where a.areaid = u_a.areaid)  ) as 负责区域 from user_area u_a where u_a.companyid = 52 group by userid

运行效果

图片1.jpg

原题目

/*
    三个表:
    user表:用户表,(公司id,会员id,会员名)(公司id和会员id共同为主键)
    companyid   userid        name
    1            1132        张三
    2            1133        李四
    2            1196        王五
    2            1197        赵六
    
    user_area表:用户地区表,(会员id,公司id,负责地区id,父级地区id)(会员id,公司id,地区id 共同为主键)
    userid        companyid    areaid        parentareaid
    1132        1            3            3
    1132        1            36            4
    1132        1            168            4
    1135        4            1            1
    1135        4            2            2
    1135        4            3            3
    
    area表:地区信息表(地区表只有两级结构,即省和市/区),(地区id,地区名,父级地区id,所有父级地区id,是否有下级地区,所有下级地区id)(areaid为主键)
    areaid    areaname    parentid    arrparentid        haschild    arrchild
    1        浙江                0            0                1            1,37,53,54,55,56,57,58,59,60,62,63
    2        北京                0            0                1            2,146,147,150,151,152,153,154,155,156
    3        上海                0            0                1            183,185,186,187,188,189,190,191,192
    36        湖州市            1            0,1                1            36,47,48,49,50,51
    37        杭州市            1            0,1                1            37,53,54,55,56,57,58,59,60,62,63,64,65,66
    
    要求根据companyid 获取各个会员所负责的省级地区,(所有数据不是真实数据,三个表可以根据字段名看出关联关系)
    
    所得结果例如:
    companyid    userid    areaname
    2            1133    
    2            1196    浙江,上海,山东
    2            1197    
    
*/
    
/*
修改一条数据 3187 得到区
UPDATE  `test`.`user_area` SET  `areaid` =  '3187' WHERE  `user_area`.`userid` =1330 AND  `user_area`.`companyid` =52 AND  `user_area`.`areaid` =3183; 
*/    

如果直接打开mysql日志文件,是mysql日志格式的,中文和一些字符是乱码形式的。

通过mysqlbinlog打开才有标准的格式文本。

结合这个命令,查找出现特定字符的sql,可定位 一些数据篡改记录问题。

脚本中,有000001 到 000997 个日志文件。

#!/bin/sh
for((i=1;i<=997;i++));
do 

#echo $i
filename=$i
len=${#i}
a=`printf "%06d\n" $i`
filename="mysql-bin."$a
echo $filename
/usr/local/mysql/bin/mysqlbinlog --database=dbname /home/mysql/data/$filename | grep 娱乐国际 >> check_log.txt

done

先安装jdk ,
http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html
20170122在blog常用软件加了jdk9.0.4的下载文件
https://blog.pucipuci.cn/file/jdk-9.0.4_linux-x64_bin.tar.gz

wget http://download.oracle.com/otn-pub/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.tar.gz?AuthParam=1511763152_88b88232c3dbf65f786070b6e8833a6c
tar -zxvf jdk-9.0.1_linux-x64_bin.tar.gz?AuthParam=1511763152_88b88232c3dbf65f786070b6e8833a6c
cp -r jdk-9.0.1 /usr/local/


vi /etc/profile
#写入
export JAVA_HOME=/usr/local/jdk-9.0.4
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile

[root@HQ tmp]# java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)


wget https://raw.githubusercontent.com/MyCATApache/Mycat-download/master/1.4-RELEASE/Mycat-server-1.4-release-20151019230038-linux.tar.gz
tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz
mv mycat/ /usr/local/

# groupadd mycat
# useradd -s /sbin/nologin -g mycat -M mycat
# passwd mycat

chown -R mycat.mycat /usr/local/mycat/
cd /usr/local
cd mycat
cd bin
./mycat start

ps -ef | grep mycat

[root@HQ bin]# ps -ef | grep mycat
root       3700      1  0 11:00 ?        00:00:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat
root       3726   3297  0 11:00 pts/1    00:00:00 grep mycat

netstat -anp | grep 8066

有端口监听

mysql -uroot -p -P8066 -hlocalhost

成功!!

mysql> alter table news add create_time datetime null;
ERROR 1878 (HY000): Temporary file write failure.

原因默认tmp空间不够

处理方法:

[root@s110732 ~]# vim /etc/my.cnf #把tmpdir设置到 /data/tmp
[root@s110732 ~]# mkdir -p /data/tmp
[root@s110732 ~]# service mysqld restart
Shutting down MySQL..... SUCCESS! 
Starting MySQL. ERROR! The server quit without updating PID file 
[root@s110732 ~]# chown -R mysql:mysql /data/tmp
[root@s110732 ~]# service mysqld restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL.. SUCCESS!