昨天项目发布,要做数据移行,要实现的功能很变态,时间很紧迫,基本上是使出了全身解数,才能有快又准地完成工作,期间发现很多小技巧串联起来使用,效果的确非常好。

武器:

1 mysqldump+mysql命令=>数据的导入导出,备份恢复

2 perl命令行=>很多时候,你有一个想法,它就能只用一句话,帮你实现它,省得编写很多代码的麻烦

3 shell命令=>组合拳,单独的命令谁都会,组合起来使用,需要一些经验的积累

4 强大的编辑器支持UltraEdit/EmEdit等=>UltraEdit最专业,但不支持字符集转换;EmEdit支持字符集转换,且最新版有很多插件可供选择,基本够常见的操作了,对于WEB开发人员来说,常需要在GB2312、utf8或者其他国家语言euc-jp、shift-jis等等编码中转来转去,EmEdit的确是首选,特别赞的还有EmEdit的录制键盘动作并播放的功能

常见组合:

1 数据移行时:

mysqldump --opt -t -h locahost -P 23236 -p mydb table -w "id>27000" > table.sql

>输入密码

OK , mydb中的表table中id大于27000的所有数据列的INSERT语句就保存到table.sql中了。-h、-P、-p就不多说了,--opt 是mysqldump的最常用组合选项,可以认为是加速语句;-t 则很有用,表示--no-create-info,就是你不需要建表语句,只需要数据(INSERT语句);-w就是where条件,也非常有用,让你有选择的导出数据。其他常见选项有:-d : 只需要建表语句,不需要insert语句;-c :给每个insert语句加上列名(field),默认时,insert语句是"insert into `table` values (1),(2),(3);",而加上-c后,就变成了"insert into table(id) values (1),(2),(3);"。有什么用?一会儿自会明白。

如果表中数据非常多,导出insert语句就非常长(默认情况下,一个表的所有数据都在一个insert语句中,不换行),要查看这个文件常常引起死机,无论是linux下用vi,less查看,还是windows用EmEdit等编辑器,因为他们都是以行为单位load数据的,一行的数据过大就会内存占用过大,怎么办?

你发现,只需要在EmEdit里查找"),("这个字符串,将它替换为"),\n(",也就是加个换行,就行了,于是就这么做,结果发现--当数据量达到上万时,EmEdit就像数羊一样一个一个替换,等它换完,你都睡了一觉了!!

怎么办呢?你当然知道写个脚本就行了,很容易,但是花的时间多,还需要测试,有简单办法吗?恩,那就轮到perl单命令行上场了:

perl -i.bak -pe 's/\),\(/\),\n\(/g' table.sql

OK,替换结束,且生成了一个备份文件table.sql.bak,如果你发现写错了,效果不对,还有救:)

当然了,如果你会用sed、awk等强大的编辑工具,这个也是小case,这里就不多说了。

2 数据导入

导出的数据经过处理,就要导入目标数据库,现在有一个表,字段非常多,其中主键为id,导入另一个数据库的相同表里,但是id不想直接插入,而是只要数据,id最好是自动生成的,跟在目标数据表最末一条数据之后即可,以免主键冲突。怎么搞呢?

这时候就能用上刚才说到的-c选项了,加了-c,导出的数据有field列,只需要把其中的id列都替换为空即可:)

这个替换过程,用EmEdit或上面说到的perl命令行都可以,只是速度的区别了。

3 接上面的问题,老数据导入了新的表,生成了一串新的连续id,但和老数据完全不一样了,现在有其他几张表中使用了老数据的id作为外键,要把它们统一改为新的id。例如:

老数据中table.id=10010,有一个表table2.table=10010,是外键关系,要把这个table2.table改为新数据表中自动产生的那个id,就比如说是6041.现在手头上的数据只有老id列表,且知道插入新表中的id是自增的,每次加1,从6041开始,怎么快速修改 table2,table3中的相应外键呢?

一个文件:

10010

10201

11301

11499

……

要替换成:

update table2 set table=6041 where id=10010;

update table2 set table=6042 where id=10201;

update table2 set table=6043 where id=11301;

update table2 set table=6044 where id=11499;

……

我们可以这么组合手头的工具:

perl -i.bak -pe 'BEGIN {$x=6041} s/^(\d+)/update table2 set table=$x where id=$1;/ ; $x++' file.txt

OK,搞定

这个例子的特色其实就是perl命令行中的BEGIN的用法,有begin,当然有end,具体就自己查查文档吧:)

4 还有EmEdit中的录制键盘动作并播放也很常用,毕竟写正则比较费脑子,用工具虽然处理速度慢一些,但是思考速度要快很多。今天碰到一件事,需要把服务器上某个目录中的bmp图片都转为jpg格式,也是要使用组合拳的,其中就用到了EmEdit的录制播放功能。

已知某目录下有N多bmp图片,通过convert命令可以转格式(安装Image::Magick模块即可)

怎么搞?

find ./ -name "*.bmp" > bmp.txt

先拿到文件列表再说。

在EmEdit中打开该列表,一行行文件名。

你发现你想做的就是:

./dir1/dir2/file1.bmp

./dir1/dir2/file2.bmp

./dir1/dir2/file3.bmp

转变为:

convert ./dir1/dir2/file1.bmp ./dir1/dir2/file1.jpg

convert ./dir1/dir2/file2.bmp ./dir1/dir2/file2.jpg

convert ./dir1/dir2/file3.bmp ./dir1/dir2/file3.jpg

这是一个非常有规律的动作,在行首,按shift+End(选择),ctrl+c(复制),End(到行尾),空格,ctrl+v(粘贴),backspace三次,输入jpg,HOME到行首,输入convert空格,下一行,HOME到行首

只要把这个操作序列记录下来,对每行都是一样操作,这时就可以使用EmEdit的录制+播放功能了,录制完成后,按F4快捷键,一爽到底~~yeah~~

运行之后要删除原图:

在shell下:

find ./ -name "*.bmp" | xargs -n1 rm -f

(找到本目录下的bmp图片文件名列表,一个一个传给rm -f,删之,慎用)

5 数据库恢复(从bin-log中恢复数据库也是一个非常重要的技巧),出现误操作或DB服务器不幸意外丢失数据时,常常要查bin-log来试图恢复数据,下次接着聊吧,累了……

呵呵,乱写写,好像不只是数据库操作了,不过挺实在,欢迎各位拍砖吧

mysql数据库实战_主题:MySQL数据库操作实战相关推荐

  1. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  2. jmeter连接mysql数据库驱动_十八、JMeter实战-JDBC连接MySQL数据库

    前言 连接数据库进行测试在工作中会比较常用,首先可以读取数据库的数据进行参数化.关联等,批量添加测试数据以及清理数据,还可以直接对SQL语句进行压测. 一.基本介绍 1. 首先第一步要导入mysql驱 ...

  3. 怎么在linux下用mysql建库_在MySQL/MariaDB中创建数据库、数据库用户和授予特权(针对Linux平台)...

    在本文中,将学习MySQL/MariaDB数据库创建.数据库用户创建以及如何向用户授予权限,方法针对Linux平台.安装数据库请参考为CentOS 8操作系统安装MySQL的方法,以安装MySQL 8 ...

  4. 数据库mysql建立索引_为mysql数据库建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  5. mysql 增量备份_云计算-开源数据库-备份

    关于备份: 备份原因:怕丢,怕被误删. 备份目标:数据的一致性,服务的可用性. 备份技术:物理备份/冷备份 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版 ...

  6. bt面板mysql经常停止_宝塔面板数据库经常自动停止解决办法,自动重启shell脚本...

    宝塔的数据库经常性自动停止,是因为网站频繁的请求数据库,而服务器内存又不足,为了保证服务器不彻底卡死,保护性的自动停止数据库,特别是有些程序比如wordpress的数据库查询次数尤为突出,wordpr ...

  7. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

  8. Rds基于mysql开发的_开发云数据库RDS MYSQL版讲解

    前言 这篇文章适合所有的 C# 开发新手.老鸟以及想准备学习开发 C# 的程序猿..NET Core是一个开源通用的开发框架,支持跨平台, 阿里云函数计算推出了 dotnetcore2.1 runti ...

  9. 添加mysql库路径_修改MySQL数据库存放路径

    MySQL 数据库默认存放路径是 /var/lib/mysql,要把它放在别的路径下,方法如下(以下操作需root权限): 1. 新建一个要存放的数据库的目录,比如:/home/jeff/mysql, ...

  10. php mysql数据库同步_实现MySQL数据库同步实例演示_MySQL

    本次实验的主要目的是剖析配置MySQL(和PHP搭配之最佳组合) 数据库的主辅MySQL数据库同步的实际操作步骤,我前两天在相关网站看见的资料,觉得挺好,就拿出来供大家分享,开始具体的配置. 本次试验 ...

最新文章

  1. [转]Entity Framework 异常: ‘OFFSET‘ 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效
  2. python:类的空间问题 类与类之间的关系
  3. 科大星云诗社动态20211205
  4. TcpClient和TcpListener 类的使用-编写一个点对点聊天工具(初级入门篇)
  5. 托管 非托管_如何在托管Kubernetes上还原Neo4J备份
  6. (五)官方Neo4j 3.3.9 Java API例子
  7. bootstrap 空行不显示横杠_bootstrap兼容问题
  8. Struts2环境搭建
  9. Linux安装prometheus+grafana监控
  10. 蓝桥杯 ALGO-51 算法训练 Torry的困惑(基本型)[前n个质数的乘积]
  11. “减少风险”还是“管理风险”哪一根才是救命稻草?
  12. 稀疏编码(sparse code)与字典学习(dictionary learning)
  13. Eclipse启动报错:A java runtime Environment(JRE) or java Development……的解决办法
  14. 数据可视化历史上的“人肉里程碑”
  15. GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一)
  16. Android手机ram大小,安卓手机RAM容量演进史,如何从192MB走到16GB,HTC:我有话要说...
  17. RTC与WebRTC有什么区别
  18. mmsegmentation导出onnx模型的问题
  19. 给女朋友做个聊天机器人,这样就能安心写代码了
  20. java编写四则运算代码_java编写四则运算

热门文章

  1. Windwos中system、System32、SysWOW64区别
  2. linux下带.d的文件夹,linux – 如何在shell脚本中包含目录中的所有文件(在本例中为/etc/init.d/iptables)...
  3. bootstrap导航条文字颜色_XEditor基础组件:导航条
  4. dom常用操作全后续会补充
  5. vue3 数据双向绑定demo
  6. 模式识别两种方法:知识和数据
  7. 【BZOJ3676】 [Apio2014]回文串(SAM,manacher)
  8. ASP.net core 使用UEditor.Core 实现 ueditor 上传功能
  9. 健康检测文件httpchk.jsp
  10. 中国人工智能学会通讯——基于视频的行为识别技术 1.7 视频的深度分段网络...