在Shell中执行Mysql语句
使用shell脚本做日志分析,为了将分析后的结果直接存储到mysql数据库中需要在shell脚本中执行mysql的语句。
方法一 将每一步需要执行的语句保存到 tmp.sql 中,最后在使用
-
mysql -u uname -p pwd < tmp.sql
方式执行
方法二 使用参数传递执行
mysql -u$user -p$pass -D $db -e “select afield from atable;”
例: 对test.dat中的每一行拼装成sql做执行
-
cat test.dat |awk '{print "insert into table(a, b) values(\047" $1 "\047, \047" $2 "\047)" }'|while read line
-
do
-
mysql -u$user -p$pass -D $db -e $line
-
done
其中 awk print命令中的 \047 代表单引号
Popularity: 30% [?]
Related
在SQlite中遍历一张表的同时更新这个表的内容碰到的一些问题
在一个连接中遍历一个表的时候同时使用sql语句更新这个表的值,碰到错误”database table locked”
首先尝试在遍历前使用 PRAGMA read_uncommitted = True;,
在遍历完成后在执行PRAGMA read_uncommitted = False;
这么处理后在遍历过程中可以对表做更新操作,不过引起另外一个问题,只能遍历一半的表记录,且当为记录行数为基数时会出现“not an error”错误,经测试估计是在遍历过程中使用执行更新sql语句时,同时向后移动了遍历的位置。
再次尝试使用两个链接来做遍历更新处理,其中一个链接做遍历,另外一个链接做更新。 在记录数少时一切正常,但是当记录数很多时候,在后面记录的更新时会出现“SQL logic error or missing database” 的错误。
最终对要遍历的表采用limit关键字分片读取出需要的数据,然后对这些数据做更新,完成后再读入下一组数据继续处理。
load a block data
while has block data
foreach record in block
do update
load next block data
Popularity: 27% [?]
Related
以单用户模式运行MS SQL Server做数据库数据修复
数据库运行碰到问题
服务器: 消息 7105,级别 22,状态 6,行 1
text、ntext 或 image 节点的页 (1:511177),槽 0 不存在。
在查询分析器中执行
-
DBCC CHECKTABLE (ErrTable, repair_allow_data_loss)
提示
服务器: 消息 7919,级别 16,状态 3,行 1
未处理修复语句。数据库需要处于单用户模式下。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
查看了SQLServer很多设置项,没有找到以单用户方式运行的参数选项。于是通过google搜索。
在CMD命令行方式下,首先进入SQL Server的BINN路径,比如 C:\Program Files\Microsoft SQL Server\MSSQL\Binn
然后输入命令:
sqlservr.exe -c -m
只要保持这窗口开着,SQL Server就在运行,不用了关闭即可了。
运行后要确保关闭所有连接数据服务器的程序,包括SqlServerAgent处理。要不然单用户模式下在已经有一个连接的情况下不能再连接服务器。
Popularity: 22% [?]
Related
在Android NDK 中使用STLport(译)
Android NDK是Native C/C++开发,不过下载来看了一下缺少常见的STL库,使用起来诸多不便,于是网上google了一把,发现有人做了这样的事情,特别转过来
——————————–
原文: Android NDK - getting STLPort up and running
作者: Pete Cole
——————————-
如果你想在Android NDK使用STLPort, 你必须要做点处理,即便你是在windows上使用cygwin.
首先, 从http://umbel.mooo.com/ 获取一份修改版的 STLPort(by John Ripley (great job, John!)). 如果你是一个 cygwin 用户, 你首先要安装一个git包(译注:可以直接下载snapshot,这样就不要安装git了).
然后将文件拷贝到你的工作目录下. 在我的机器上, 我将文件拷贝到了c:\android-ndk-1.5_r1 目录下, 并将 两个hello-stl 文件夹移动到其他和NDK有关的目录下:
C:\android-ndk-1.5_r1\apps\hello-stl C:\android-ndk-1.5_r1\sources\samples\hello-stl
然后在Build STLPort前必须修改一些文件…
setup.sh
将最前面的一些行修改正如下样子:
-
#!/bin/bash
-
if uname | grep -qi linux; then
-
export NDK_HOST=linux-x86
-
elif uname | grep -qi CYGWIN; then
-
export NDK_HOST=windows
-
else
-
export NDK_HOST=darwin-x86
-
fi
将倒数第三行修改成如下样子:
-
ln -sf "$NDK_DIR/build/prebuilt/${NDK_HOST}/arm-eabi-4.2.1/bin/arm-eabi-$tool" arm-linux-$tool
stlport/build/lib/android.mak
将TOOLCHAIN_PREFIX这一行修改成
-
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.2.1/bin/arm-eabi-
译注: 我下载来的Wrapper包已经是这个样子了,不用修改
sources/samples/hello-stl/Android.mk
将STLPORT_BASE这一行修改成如下样子:
-
STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport
译注:我没有修改这边,执行了一个export NDK_WRAPPERS_BASE=basepath的操作
将:
-
LOCAL_LDLIBS += -L$(STLPORT_BASE)/build/lib/obj/gcc/so \
-
-lstlport
修改成
-
LOCAL_STATIC_LIBRARIES := libstlport.5.1
Building STLPort
现在文件已经被合并了,你可以立即build STLPort了!
执行如下cygwin shell脚本… 它将build STLPort的静态链接库! 对此你只需要做一次.
-
export NDK_DIR=/cygdrive/c/android-ndk-1.5-r1
-
cd $NDK_DIR
-
./env.sh
-
./setup.sh
现在,像下面这样讲文件拷贝到你的工程中:
-
cp -p \
-
/cygdrive/c/android-ndk-1.5_r1\stlport\build\lib\obj\gcc\ar\libstlport.5.1.a \
-
/cygdrive/c/android-ndk-1.5_r1\out\apps\hello-stl\android-1.5-arm
Building your project’s shared library.
现在你可以返回cygwin的shell窗口,然后执行如下命令:
-
cd /cygdrive/c/android-ndk-1.5_r1
-
make APP=hello-stl
将编译你的共享库文件:
C:\android-ndk-1.5_r1\apps\hello-stl\project\libs\armeabi\libhello-stl.so
注: 这会将STLPort静态链接到你的库中.
Building the hello-stl project
在Eclipse中,使用New Project Wizard为每一个例子创建一新的Android project, 使用”Import from Existing Source” 选项从c:\android-ndk-1.5_r1\apps\hello-stl\project 导入源文件
现在你可以编译和运行你的项目了. 将显示从共享库中返回来的std::string字符串 …!
Popularity: 24% [?]
Related
ASQLite控件的Blob类型字段内存泄漏问题
使用Delphi的ASqlite控件做Sqlite数据库的数据维护,最近打开一个大的表,总是报”out of memory while expading memory stream” 的错误,提示内存不足。
经分析,是由于ASqlite控件在默认情况下总是将数据装入内存,记录数太多时造成数据不能完整装入。经查有UniDirectional数据可是设置为单方向使用表,可以不将记录完整装入到内存。但是设置了该属性值为True后,遍历表仍然是”Out of memory while expanding memory stream” 错误,感觉没有起作用。
分析ASQlite的源码,发现其将memo类型数据当作blob类型处理,而在UniDirectional为True是,读取记录时创建的BlobStream没有释放,因此和UniDirectional为False时行为一样。
修正Bug,打开ASGSqlite3.pas,将
-
function TASQLite3BaseQuery.GetRecord(Buffer: PAnsiChar; GetMode: TGetMode;
-
DoCheck: boolean): TGetResult;
函数的末尾部分
-
if Result = grOK then
-
begin
-
if FUniDir then begin
-
ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
-
if ptr <> nil then begin
-
Move(ptr^, ActiveBuffer^, MaxStrLen);
-
end else Result := grEOF;
-
end else begin
-
ptr := FResult.GetData(FCurRec);
-
if FResult.Count = 0 then
-
InternalInitRecord(Buffer)
-
else
-
if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
-
end;
-
…
修改为
-
if Result = grOK then
-
begin
-
if FUniDir then begin
-
// 增加部分,释放前一记录的blobstream内存
-
if FResult.Count > 0 then begin FResult.FreeBlobs; FResult.Delete(0); end;
-
-
ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
-
if ptr <> nil then begin
-
FResult.Add(ptr, 0); // 增加部分,当前行添加到缓存中,等待下次释放
-
Move(ptr^, ActiveBuffer^, MaxStrLen);
-
end else Result := grEOF;
-
end else begin
-
ptr := FResult.GetData(FCurRec);
-
if FResult.Count = 0 then
-
InternalInitRecord(Buffer)
-
else
-
if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
-
end;
-
…
修改后编译程序,再次打开库文件遍历表,没有再次出现问题。
Popularity: 22% [?]
