shell如何调用带参数的mysql存储过程

sohoxxd 2008-09-08 10:17:38
问题是这样,需要对mysql数据库中的一张表做备份操作,数据库在linux上,考虑用crontab对表定时备份,这张表是利用存储过程生成的,因此需要写一个shell脚本,调用mysql的这个存储过程,并且在shell中对生成的表做备份操作。
也不知道问题描述清楚了没,各位有没可以参考的脚本。
...全文
989 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
chukchi 2009-09-15
  • 打赏
  • 举报
回复
我想看看
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
wwwwb
Thank you!
引擎改为innodb,locked的问题解决了。
但是还是进行测试,要优化。
200分送上,不成敬意。。。
wwwwb 2008-09-09
  • 打赏
  • 举报
回复
如果一定要在服务运行期间备份,请添加 –skip-opt选项,类似执行:

/usr/local/mysql/bin/mysqldump --skip-opt -uroot -p123456 mysqlfxv >mySQL.SQL

以免造成了锁表。

--opt
此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。(个人推荐。

如果没有使用--opt,MYSQLDUMP就会把整个结果集装载到内存中,然后导出。如果数据非常大就会导致导出失败。这个开关在默认情况下是启用的,如果不想启用它:--skip-opt来关闭它。)
wwwwb 2008-09-09
  • 打赏
  • 举报
回复
呵呵,你是用引擎MyISAM吧
如果是innodb的表,那么使用参数--single-transaction可以保持数据库的一致性,而锁表的时间很短。

如果不是 innodb表,那么就要使用--lock-tables或者--lock-all-tables,这样在整个导出过程中加读锁,期间更新操作不能进行,当数据库比较大的时候需要注意。--lock-tables是按数据库加锁,不能保证全部数据库的一致性,--lock-all-tables是给所有数据库的所有表加锁。
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
再次发现,insert进去了5条记录
insert的同时,表被locked
insert完成后,locked状态消失。。。
是不是再进行插入操作时表会自动锁上。。。
如果出现了异常,一直处于locked状态,那服务器不是非常不稳定。
又没有什么好的方法,大家不吝赐教。。。
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
未做任何新的操作,
只是再此执行了unlock tables
看了一下原始表的属性
show processlist 发现locked的state全部消失了
又可以写数据了
这死锁时间是不是忒长了点
实在不解。。。
打字的功夫,刷新了一下后台,locked又出现了。。。再unlock tables也没用。。。
wwwwb 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sohoxxd 的回复:]
还有我表的引擎时MyISAM,看资料说大数据量的插入检索用InnoDb引擎比较好,MyISAM是表级locked。
现在问题是如果出现死锁,我服务器的缓存肯定会撑满,导致服务器down掉。。。
[/Quote]
大量数据时用InnoDb引擎比较好,记录级locked
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
还有我表的引擎时MyISAM,看资料说大数据量的插入检索用InnoDb引擎比较好,MyISAM是表级locked。
现在问题是如果出现死锁,我服务器的缓存肯定会撑满,导致服务器down掉。。。
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
MYSQLDUMP
我还没有做备份操作
实际情况是,我要备份的表需要用来存储从终端发送来的大量数据
每天的数据量在千万数量级,因此考虑在终端数据量较小时做数据备份操作,将前一天的数据导出到临时表进行备份操作。
数据从原始表中导出,写到临时表,再删除原始表中前一天的数据都是在存储过程中完成的
crontab中写入shell脚本就是做定时备份,备份工作在sh中完成
现在测试发现,我在终端发送数据时执行存储过程,执行完成后就出现了对原始数据表的相关操作被locked无法写入数据
wwwwb 2008-09-09
  • 打赏
  • 举报
回复
你是用什么工具备份的?MYSQLDUMP还是其它软件?
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
老问题没解决,新问题又来了。现在要备份的表出现了被锁的情况,insert全部被锁住,select部分语句locked,
使用show processlist命令,可以看到多个state是locked状态。
用unlock tables 没什么作用,依然是locked状态。
如何解决?
wwwwb 2008-09-09
  • 打赏
  • 举报
回复
如果只是备份的话:
C:\MySQL\bin\mysqladmin -u root --password=123456 shutdown
C:\MySQL\bin\mysqldump --opt -u root --password=123456 bbs > D:\db_backup\bbs.sql
C:\MySQL\bin\mysqld-nt
将以上代码保存为backup_db.bat
然后使用Windows的“计划任务”定时执行该脚本即可。(例如:每天凌晨5点执行back_db.bat)
sohoxxd 2008-09-09
  • 打赏
  • 举报
回复
不能直接在shell里面调用mysql的存储过程吗?
cd /usr/local/mysql/bin

#declare parameter
today='date +%Y-%m-%d';
yesterday='date +%Y-%m-%d -d "1 day ago"';

#call procedure
mysql -u root -p password dababase<<EOF
begin
exec P_CollectionDataBackup($today,$yesterday);
end;
EOF

#backup
mysqldump -u root -p password dababase $yesterday > ../CollectionDataBackup/$yesterday.sql

不知道这种写法正确不?
iihero_ 2008-09-08
  • 打赏
  • 举报
回复
把你的存储过程及备份之类的东东做成一个sql文件,
然后
su - mysqluser mysql -uroot -p<password> <database> < yoursql.sql
把这个sh加到你的crontab任务里边
WWWWA 2008-09-08
  • 打赏
  • 举报
回复
应该是在语言环境中调用MYSQL的储存过程吧
trainee 2008-09-08
  • 打赏
  • 举报
回复
应该是mysql -e "SQL语句"
具体可帮助mysql --help

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧