LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2758|回复: 8

请问如何用shell操作mysql呢?

[复制链接]
发表于 2005-4-25 10:23:37 | 显示全部楼层 |阅读模式
请问如何用shell操作mysql呢?录入修改数据等等!
发表于 2005-4-25 10:42:16 | 显示全部楼层
需要用到SHELL吗?
不必吧?
MYSQL有一个命令行工具叫mysql
如果你要批量录入,也可用mysql直接导入
关于mysql工具的使用方法,请man或到官方主页去查找相关资料
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-25 14:57:12 | 显示全部楼层
是这样的,我需要机器自动在某的时间段来执行操作mysql的行为,而这个机器上没有其他可以用的,就只有用shell了!
回复 支持 反对

使用道具 举报

发表于 2005-4-25 15:36:37 | 显示全部楼层
Post by hamphery
是这样的,我需要机器自动在某的时间段来执行操作mysql的行为,而这个机器上没有其他可以用的,就只有用shell了!


OK,我明白了
看这样行不行:
1,用expect这个工具来登录mysql并执行SQL语句
2.如果是数据导出(备份),数据导入(增加记录),则直接可用mysql数据库提供的工具写成脚本
如:/PATH/mysql -u username -p password  dbname >/PATH/db_backup.txt

上面的两种方案写成脚本后放入corn中定时执行

如果还不行,我们再继续讨论讨论
回复 支持 反对

使用道具 举报

发表于 2005-4-25 15:41:38 | 显示全部楼层
mysql是MySQL的终端交互接口,如果要在shell中调用它来执行非交互的cron任务,可以考虑两种方法。第一种是使用expect,第二种是将包含有SQL语句的文本文件重定向输入至mysql以作为命令来执行,个人推荐后者。

例如你有一个文本文件sample.mysql如下:

  1. CREATE TABLE `ftpquotatallies` (
  2.   `name` varchar(30) NOT NULL default '',
  3.   `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  4.   `bytes_in_used` float NOT NULL default '0',
  5.   `bytes_out_used` float NOT NULL default '0',
  6.   `bytes_xfer_used` float NOT NULL default '0',
  7.   `files_in_used` int(10) unsigned NOT NULL default '0',
  8.   `files_out_used` int(10) unsigned NOT NULL default '0',
  9.   `files_xfer_used` int(10) unsigned NOT NULL default '0'
  10. ) TYPE=MyISAM;
复制代码

然后在shell脚本中调用以下命令:

  1. mysql -u [i]dba_user[/i] -p[i]passwd[/i] [i]mydb[/i] < sample.mysql
复制代码

将dba_user替换为你的mysql数据库帐号,password替换为该帐号的密码,mydb替换为你要操作的数据库名称即可。当然,这样会有安全隐患,注意保证这个脚本的root只读权限,谨慎使用!

要改变你的操作内容,只需要重新构造sample.mysql即可,使用cat、awk、sed这些文本操作工具可以很方便地完成这种任务。
回复 支持 反对

使用道具 举报

发表于 2005-4-26 11:15:51 | 显示全部楼层
to :home_king  
写的很好啊 ,我也是遇到这个问题。。我每天有新的数据过来(.txt文件),要定时写到mysql的表中去

“mysql -u dba_user -ppasswd mydb < sample.mysql  ”sample.mysql 要放在特别的目录下吗?或是随便放什么目录,加路径名就可以??
回复 支持 反对

使用道具 举报

发表于 2005-4-26 11:38:49 | 显示全部楼层
不用放在特别的目录

只要把路径加上就可以了,原型看我在第4帖里的例子
回复 支持 反对

使用道具 举报

发表于 2005-4-26 12:03:23 | 显示全部楼层
Post by yintao_1982
to :home_king  
写的很好啊 ,我也是遇到这个问题。。我每天有新的数据过来(.txt文件),要定时写到mysql的表中去

“mysql -u dba_user -ppasswd mydb < sample.mysql  ”sample.mysql 要放在特别的目录下吗?或是随便放什么目录,加路径名就可以??



  1. #!/bin/sh
  2. # mysql.sh

  3. MYSQL="/usr/local/mysql/bin/mysql"
  4. SQLFILE="loaddata.sql"
  5. DATAFILE="/home/data.txt"
  6. DATABASE="data"
  7. TABLE="table"
  8. USER="dbuser"
  9. PASS="password"

  10. cat >$SQLFILE <<ENDOFSQL
  11. USE $DATABASE;
  12. LOAD DATA INFILE $DATAFILE
  13.     INTO TABLE $TABLE
  14.     FIELDS TERMINATED BY '\t'
  15.     OPTIONLLY ENCLOSED BY '"'
  16.     ESCAPED BY '\\'
  17. LINES TERMINATED BY '\r\n';
  18. quit;
  19. ENDOFSQL


  20. $MYSQL -u $USER -p$PASS<$SQLFILE

  21. rm -rf $SQLFILE

  22. exit 0

复制代码


Please add this to your crontab.
BTW,You also can  just use -p and not set the password in this file,the shell will prompt you to enter the password.This will be more security,I think.

Finally,I suggest you using the Perl to do this ,Because perl has a DBI ,and can operate the MySQL directly.
Best Regards.
回复 支持 反对

使用道具 举报

发表于 2005-4-26 13:27:35 | 显示全部楼层
mysql -u root -pa -D mysql -e "select user,password from user"
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表