Django-MySQL enable Row_Format=Compress with syncdb - mysql

I have an application in Django and MySQL, in my model I have several fields specified as TextField, when i run syncdb the tables for my model are created and the specified columns are created with longtext data type, so far so good.
But when I try, enter information in the table I get the following error
DatabaseError: (1118, 'Row size too large. The maximum row size for
the used table type, not counting BLOBs, is 8126. You have to change
some columns to TEXT or BLOBs ")
I changed the column type to Text and Blob, and did not solve the problem.
I've been reading about this error and is due to more than 8126bytes income information by row. So I changed the configuration of MySQL to work with the file type Barracuda instead of Antepode, which I have been reading allows compression of sending information over to a different file.
But this did not solve the problem, in the MySQL documentation (https://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html) tells me that I have to specify ROW_FORMAT = COMPRESSED when i create the table, but this is done by syncdb,
Is there way to specify these settings when syncdb creates the tables or I have to create the tables manually without using syncdb?
Any other suggestions would be welcome, in my application I have to store multiple sheets and reports. I have defined a column in my table by section of the document.

i solved the error to add big data rows in MySQL using innodb
DatabaseError: (1118, 'Row size too large. The maximum row size for
the used table type, not counting BLOBs, is 8126. You have to change
some columns to TEXT or BLOBs ")
first we have to set the file format to Barracuda and enable one file per table global variable in MySQL with:
SET GLOBAL innodb_file_format = Barracuda;
SET GLOBAL innodb_file_format_check = ON;
SET GLOBAL innodb_format_max = Barracuda;
SET GLOBAL innodb_file_per_table = ON;
i used phpmyadmin for querys.
Then after run syncdb we go to the table where we have the problem with the large rows, go to the tab Operations->Table Options and then modify 'ROW_FORMAT' to 'COMPRESS'.
i hope this was helpful

Related

MySql General Query Log File Name in Truncate

This involves MySQL 5.7 running on Windows Server 2016.
I'm working with a TRUNCATE statement in MySql to reduce the size of a large Log file (named "mySite.log"), which resides in:
ProgramData/MySQL/MySQL Server 5.7/Data/
I have researched and implemented the following:
mysql> SET GLOBAL general_log=OFF;
and this was successful.
However, I am trying to ascertain that the large log file that I see in the directory stated above is in fact the General Query Log File. It carries the name of the database as the prefix of the file name ("MySite.log") just as the other files (.bin's and .err, .pid) in the same directory do.
Is this large log file actually the general_log file? (If using MySQL Workbench, where would the naming of the log file and storage location be set up? I can't seem to locate that.)
Will the following syntax truncate the log file?
mysql> TRUNCATE TABLE mysql.general_log;
Will 'TRUNCATE TABLE' be used, even if the log is stored in a file, rather than database table?
Will 'mysql.general_log' need to be renamed to 'myDatabase.mysite' to match the name of my "MySite.log" file, from above?
Thanks for any leads.
Some interesting manual entries to read about this:
5.4.1 Selecting General Query and Slow Query Log Output Destinations
5.4.3 The General Query Log
You can check how your server is configured with
SHOW GLOBAL VARIABLES LIKE '%log%';
Then look for the value of log-output. This shows if you're logging to FILE, TABLE or both.
When it's FILE, check for the value of general_log_file. This is where the log file is in your file system. You can simply remove it, and create a new file (in case you ever want to enable general_log again). Then execute FLUSH LOGS; afterwards.
When it's TABLE then your TRUNCATE TABLE mysql.general_log; statement is correct.
Regarding your second question, just never mess with the tables in the mysql schema. Just don't (if you don't know what you're doing). Also I don't even get how you got to that thought.

Error Code: 1118. Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format,

I have a table with 600 fields in which datatype of all the 600 fields is 'TEXT'.
Now when we are trying to insert some data to this table it is showing the below error
Error Code: 1118. Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline
My configuration file contains the following parameters:
innodb_strict_mode=OFF
innodb_log_file_size = 2G
innodb_log_buffer_size = 512M
innodb_file_format = Barracuda
max_allowed_packet = 1G
But still, couldn't insert the data. I there any way we can resolve this?
If InnoDB strict mode (10.5.9-MariaDB) is enabled this error can show.
Check enabled or not
SHOW variables LIKE '%strict%';
If enable then you can disable.
SET GLOBAL innodb_strict_mode=OFF;
For more detail information read here>>
Try to add following options to your configuration file:
To activate new file format: innodb_file_format = Barracuda
To store each table in own file: innodb_file_per_table=1
To prevent surprises: innodb_strict_mode=ON
To store long variable-length column values use dynamic or compressed row format for large tables. For example, use
ALTER TABLE LargeTable ENGINE = InnoDB ROW_FORMAT = DYNAMIC;
The suggestion from here worked for me.
For those using MariaDB 10.2 and later, the DYNAMIC row format is the default row format therefore increase the length of VARCHAR in the affected table
E.g
col1 varchar(256) NOT NULL,
The 256 byte limit means that a VARCHAR column will only be stored on overflow pages if it is at least as large as a varchar(256):
You can learn more here
Simply in my.ini file, add below line.It worked for me.
innodb_strict_mode = 0

Restoring a MySQL dump with binary blobs

I am moving a MySQL database from a now inaccessible server to a new one. The dump contains tables which in turn contain binary blobs, which seems to cause trouble with the MySQL command line client. When trying to restore the database, I get the following error:
ERROR at line 694: Unknown command '\''.
I inspected the line at which the error is occurring and found that it is a huge insert statement (approx. 900k characters in length) which seems to insert binary blobs into a table.
Now, I have found these two questions that seem to be connected to mine. However, both answers proved to not solve my issue. Adding --default-character-set=utf8 or even --default-caracter-set=latin1 didn't change anything and creating a dump with --hex-dump is not possible because the source database server is no longer accessible.
Is there any way how I can restore this backup via the MySQL command line client? If yes, what do I need to do?
Please let me know if you need any additional information.
Thanks in advance.
EDIT: I am using MySQL 5.6.35. Also, in addition to the attempts outlined above, I have already tried increasing the max_allowed_packet system variable to its maximum value - on both server and client - but to no avail.
If I remember correctly, you need to set the max_allowed_packet in your my.cnf to a large enough value to accommodate the largest data blob in your dump file, and restart the MySQL server.
Then, you can use a restore command like this one :
mysql --max_allowed_packet=64M < your_dumpfile.sql
More info here :
[https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_allowed_packet]
No solution, just confirming that I had seen the same behavior with a "text" field type that contains a long JSON string. The SQL (backup) file that MySQLdump generates has an INSERT statement and it truncates the length of that particular text field to "about" 64K (there are many escaped quotes/double-quotes and various UTF-8 characters) - without issuing a warning that such truncation had occurred.
Naturally the restore into a JSON column fails because of the premature termination of the JSON formatted string.
What was odd in this case, that the column in the backed-up table was defined as TEXT, which indeed should have been limited to 64 KB. On a hunch, I changed the schema for the backed up table to MEDIUMTEXT. After THAT MySQLdump no longer truncated that string in the INSERT statement somewhere beyond 64K.
It appears as if MySQLdump doesn't just output the entire column, but truncates to whatever it thinks the maximum string length should be based on schema information, and does NOT issue warnings when it does truncate.

maximum character size that a mysql query can handle

I am trying to run this query but there are no values being retrieved , I tried to find out the length of characters till which values are returned. Length was 76 characters.
Any suggestions?
SELECT tokenid FROM tokeninfo where tokenNumber = 'tUyXl/Z2Kpua1AvIjcY5tMG+KlEhnt+V/YfnszF5m1+q8ngYvw%L3ZKrq2Kmtz5B8z7fH5BGQXTWAoqFNY8buAhTzjyLFUS64juuvVVzI7Af5UAVOj79JcjKgdNV4KncdcqaijPQAmy9fP1w9ITj7NA==%';
The problem is not the length of the characters you select, but in the characters, which are stored in database field itself. Check the tokenNumber field in your database schema - if it is varchar, or blob or whatever type, what is the length, etc...
You can insert/select pretty much more than 76 characters in any database, but you can get less that 76, as in your case, it depend on how you handle the field they are stored in.
A quick way to see the tokeninfo table properties is to run this query:
SHOW COLUMNS FROM tokeninfo;
If the data types differ from what you expect them to be based on a CREATE TABLE statement, note that MySQL sometimes changes data types when you create or alter a table. The conditions under which this occurs are described in Section 13.1.10.3, Silent Column Specification Changes.
the max size would be limited by the variable max_allowed_packet
so, if you do a
show variables like 'max_allowed_packet'
it will show you the limit. By default, it is set to
1047552 bytes.
If you want to increase that, add a line to the server's
my.cnf file, in the [mysqld] section :
set-variable = max_allowed_packet=2M
and restart mysql server.

how many 'text' column a table could have in mysql? I have this error "Row size too large (> 8126)."

I'm working on a application which is kinda complex to explain how it works. But this is the situation I'm in,
------------------------------------------------------------------------------
FIELD1 (TEXT) FIELD2(TEXT) FIELD3(TEXT) .........................FIELD70(TEXT)
------------------------------------------------------------------------------
POSSIBLE DATA SIZE FOR A SINGLE FIELD: around 500 characters.
I have around 20 tables in a single database like this.
I know it's too bad idea to have this much column in a single table. But I have to go with this since It's went too far and can not modify number of columns.
Now I got some error like,
"Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline."
WHAT I HAVE TRIED:
I altered the table as ROW_FORMAT=COMPRESSED. = didn't work out
I altered the table as ROW_FORMAT=DYNAMIC. = didn't work out
innodb_file_format = Barracuda = didn't work out
I altered the column to VARCHAR(500) = didn't work out
What could be the actual error? I've seen plenty of the answers for this problem bur they are telling these above methods that I've tried and failed.