没法找到具体原因?
注意如下的解决方法,除了第一个提题主说明了为啥sqlite文件没有一直增长外。
其他的似乎都走的是推倒重来的路线。。。。
内容来自:http://stackoverflow.com/questions/5274202/sqlite3-database-or-disk-is-full-the-database-disk-image-is-malformed
My database is about 25 MB,and I've verified that the username accessing it,as well as the file permissions haven't changed in months. I'm having a problem where queries are failing due to a "database or disk is full" and then sometimes "database disk image is malformed" issue. Unless I'm reading this wrong,my disk isn't anywhere near full (this is an Ubuntu server,9.10,if it makes any difference) Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 19610300 2389596 16224560 13% / udev 10240 128 10112 2% /dev none 254136 0 254136 0% /dev/shm none 254136 36 254100 1% /var/run none 254136 0 254136 0% /var/lock none 254136 0 254136 0% /lib/init/rw As a test I just did an action that added a new record,and it's fine. I'm trying to fiqure out if there's a specific set of actions that are failing. However,after the insert (and verifying that it's there) the number of bytes on disk for the database has not changed (neither up nor down). Using the command line utility results in something like the following,which is failing spectacularly :) sqlite version 3.6.12 Enter ".help" for instructions Enter sql statements terminated with a ";" sqlite> pragma integrity_check; *** in database main *** On tree page 2 cell 0: 2nd reference to page 26416 On tree page 2 cell 1: 2nd reference to page 26417 On tree page 2 cell 2: 2nd reference to page 26434 On tree page 2 cell 3: 2nd reference to page 26449 On tree page 2 cell 4: 2nd reference to page 26464 On tree page 2 cell 5: 2nd reference to page 26358 On tree page 2 cell 6: 2nd reference to page 26494 On tree page 2 cell 7: Child page depth differs On tree page 2 cell 8: 2nd reference to page 26190 On tree page 2 cell 8: Child page depth differs ... etc.,etc. ... Any ideas on where I should be looking next? Is there a problem with the maximum number of rows in a table or something? I did some reading on sqlite3 max values,and nothing in my database is anything close to them as far as I can tell. I then took a look at my daily backups,and I see that the database backup hasn't changed in file size for 3-4 days - very strange. I restored a backup copy of the database from before the time it was not changing in file size,and still getting strange issues. I'm thinking I'm going to have to (1) restore from an older backup,and (2) re-run my Rails migrations to fix. |
||||||||
|
15
|
A few things to consider:
|
|||||||||
@L_404_31@
|
To repair a corrupt database you can use the sqlite3 commandline utility. Type in the following commands in a shell after setting the environment variables:
cd $DATABASE_LOCATION echo '.dump'|sqlite3 $DB_NAME|sqlite3 repaired_$DB_NAME mv $DB_NAME corrupt_$DB_NAME mv repaired_$DB_NAME $DB_NAME
This code helped me recover a sqlite database I use as a persistent store for Core Data and which produced the following error upon save:
Could not save: NSError 259 in Domain NSCocoaErrorDomain { NSFilePath = mydata.db NSUnderlyingException = Fatal error. The database at mydata.db is corrupted. sqlite error code:11,'database disk image is malformed' }
Thank you a million times over - I spent a couple hours creating a Core Data database which was having this error code 11 issue (in iOS 4.3 but not 4.2 for some reason) and wouldn't load,but dumping into a newly created database like this fixed the issue. Yes!–
Cory Imdieke
Jun 9 '11 at 22:10
|
This was exactly what I needed. Doing dev work on a remote target thats running OE. I attempted to copy the DB not knowing it was being written to,and was getting errors that was throwing off the DB. This fixed the problem right-skippy.–
Justin Carroll
Jan 28 '13 at 18:14
|
Shout out to Pegolon ... just saved a customer's bacon with this recipe. Thanks much!–
MichelV69
Jun 14 '13 at 12:33
|
I had a similar issue,and this pointed me to the right direction,but just doing the dump wasn't enough... it was producing a new sqlite file with 0 bytes. I had to dump the sql file into a text file first,and then remove some lines with "error" written in them that were obvIoUsly from the sqlite system,and then created a sqlite file using that text file's sql. That worked for me.–
Z S
Aug 20 '13 at 1:26
|
To avoid getting "database or disk is full" in the first place,try this if you have lots of RAM:
sqlite> pragma temp_store = 2;
That tells sqlite to put temp files in memory. (The "database or disk is full" message does not mean either that the database is full or that the disk is full! It means the temp directory is full.) I have 256G of RAM but only 2G of /tmp,so this works great for me. The more RAM you have,the bigger db files you can work with.
If you haven't got a lot of ram,try this:
sqlite> pragma temp_store = 1; sqlite> pragma temp_store_directory = '/directory/with/lots/of/space';
temp_store_directory is deprecated (which is silly,since temp_store is not deprecated and requires temp_store_directory),so be wary of using this in code.
I had plenty of disk space in /tmp that didn't appear to be used. I was creating a temporary table that was causing the "database or disk is full" error to be thrown. Setting temp_store to use memory solved the problem. I had 3GB of ram and 1.6GB of /tmp.–
N Klosterman
Dec 11 '14 at 2:25
|