Bagaimana saya bisa mengubah batas
Ukuran baris terlalu besar (> 8126). Mengubah beberapa kolom menjadi TEXT atau BLOB atau menggunakan ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
mungkin membantu. Dalam format baris saat ini, BLOB
prefiks 768 byte disimpan sebaris.
Meja:
id int(11) No
name text No
date date No
time time No
schedule int(11) No
category int(11) No
top_a varchar(255) No
top_b varchar(255) No
top_c varchar(255) No
top_d varchar(255) No
top_e varchar(255) No
top_f varchar(255) No
top_g varchar(255) No
top_h varchar(255) No
top_i varchar(255) No
top_j varchar(255) No
top_title_a varchar(255) No
top_title_b varchar(255) No
top_title_c varchar(255) No
top_title_d varchar(255) No
top_title_e varchar(255) No
top_title_f varchar(255) No
top_title_g varchar(255) No
top_title_h varchar(255) No
top_title_i varchar(255) No
top_title_j varchar(255) No
top_desc_a text No
top_desc_b text No
top_desc_c text No
top_desc_d text No
top_desc_e text No
top_desc_f text No
top_desc_g text No
top_desc_h text No
top_desc_i text No
top_desc_j text No
status int(11) No
admin_id int(11) No
No
sedang ditampilkan?Jawaban:
Pertanyaan telah ditanyakan pada serverfault juga.
Metode yang berhasil untuk OP itu adalah:
Tambahkan berikut ini ke
my.cnf
file di bawah[mysqld]
bagian.ALTER
tabel untuk digunakanROW_FORMAT=COMPRESSED
.Ada kemungkinan hal di atas masih belum menyelesaikan masalah Anda. Ini adalah bug yang diketahui (dan diverifikasi) dengan mesin InnoDB , dan perbaikan sementara untuk saat ini adalah kembali ke mesin MyISAM sebagai penyimpanan sementara. Jadi, di
my.cnf
file Anda :sumber
innodb_file_per_table=1
untuk mengaktifkan opsi ini.Saya mengalami masalah ini baru-baru ini dan menyelesaikannya dengan cara yang berbeda. Jika Anda menjalankan MySQL versi 5.6.20, ada bug yang diketahui di sistem. Lihat dokumen MySQL
Dalam situasi saya, tabel blob yang menyinggung berukuran sekitar 16MB. Jadi, cara saya menyelesaikannya adalah dengan menambahkan baris ke my.cnf yang memastikan saya memiliki setidaknya 10x jumlah itu dan kemudian beberapa:
innodb_log_file_size = 256M
sumber
longblob
bidang menghilang segera setelah saya meningkatkaninnodb_log_file_size
parameter. Juga menjalankan 5.6.20.Tetapkan yang berikut pada file my.cnf Anda dan mulai ulang server mysql.
sumber
innodb_strict_mode=0
-> tanpa spasi. Jika tidak, memulai ulang mariaDB 10.2 menghasilkan kesalahan :-PJika Anda dapat mengganti ENGINE dan menggunakan MyISAM daripada InnoDB, itu akan membantu:
ENGINE=MyISAM
Ada dua peringatan dengan MyISAM (bisa dibilang lebih):
sumber
Saya ingin membagikan jawaban yang luar biasa, mungkin bisa membantu. Kredit Tagihan Karwin lihat di sini /dba/6598/innodb-create-table-error-row-size-too-large
Mereka bervariasi berdasarkan format file InnoDB. Saat ini ada 2 format yang disebut Antelope dan Barracuda.
File tablespace pusat (ibdata1) selalu dalam format Antelope. Jika Anda menggunakan file-per-table, Anda dapat membuat file individual menggunakan format Barracuda dengan mengatur innodb_file_format = Barracuda di my.cnf.
Poin dasar:
Satu halaman 16 KB data InnoDB harus menampung setidaknya dua baris data. Ditambah setiap halaman memiliki header dan footer yang berisi checksum halaman dan nomor urut log dan sebagainya. Di situlah Anda mendapatkan batas Anda sedikit kurang dari 8KB per baris.
Tipe data ukuran tetap seperti INTEGER, DATE, FLOAT, CHAR disimpan di halaman data utama ini dan dihitung dalam batas ukuran baris.
Jenis data berukuran variabel seperti VARCHAR, TEXT, BLOB disimpan di halaman tambahan, sehingga tidak dihitung sepenuhnya terhadap batas ukuran baris. Di Antelope, hingga 768 byte dari kolom tersebut disimpan di halaman data utama selain disimpan di halaman overflow. Barracuda mendukung format baris dinamis, sehingga hanya dapat menyimpan penunjuk 20-byte pada halaman data utama.
Tipe data ukuran variabel juga diawali dengan 1 atau lebih byte untuk menyandikan panjangnya. Dan format baris InnoDB juga memiliki array ofset lapangan. Jadi ada struktur internal yang kurang lebih didokumentasikan di wiki mereka.
Barracuda juga mendukung ROW_FORMAT = COMPRESSED untuk mendapatkan efisiensi penyimpanan lebih lanjut untuk data overflow.
Saya juga harus berkomentar bahwa saya belum pernah melihat tabel yang dirancang dengan baik melebihi batas ukuran baris. Ini adalah "bau kode" yang kuat bahwa Anda melanggar ketentuan grup berulang dari Formulir Normal Pertama.
sumber
Saya memiliki masalah yang sama, ini menyelesaikannya untuk saya:
Dari Dokumentasi MYSQL :
sumber
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; lagiSetelah menghabiskan berjam-jam saya telah menemukan solusinya: jalankan saja SQL berikut di admin MySQL Anda untuk mengonversi tabel ke MyISAM:
sumber
create table
memiliki opsi yang sama:CREATE TABLE ... ENGINE=MyISAM ...
Saya mengalami masalah ini ketika saya mencoba memulihkan database mysql yang dicadangkan dari server yang berbeda. Apa yang memecahkan masalah ini bagi saya adalah menambahkan pengaturan tertentu ke my.conf (seperti dalam pertanyaan di atas) dan juga mengubah file cadangan sql:
Langkah 1: Tambahkan atau edit baris berikut di my.conf:
Langkah 2 tambahkan ROW_FORMAT = DYNAMIC ke tabel buat pernyataan di file cadangan sql untuk tabel yang menyebabkan kesalahan ini:
perubahan penting di atas adalah ROW_FORMAT = DYNAMIC; (yang tidak termasuk dalam file cadangan orignal sql)
sumber yang membantu saya menyelesaikan masalah ini: MariaDB dan InnoDB Ukuran Baris MySQL terlalu besar
sumber
innodb_page_size=32K
tidak berfungsi, karena menyebabkan kesalahan untuk memulai ulang MariaDB 10.2 dalam kasus saya. Sebagai gantinya, saya menambahkaninnodb_strict_mode=0
baris, seperti yang dijelaskan di siniinnodb_page_size
membutuhkanibdata*
rekreasi, yang merupakan operasi yang merusak. Perhatikan syslog Anda untuk informasi lebih lanjutJawaban lainnya menjawab pertanyaan yang diajukan. Saya akan membahas penyebab yang mendasarinya: desain skema yang buruk.
Jangan melebarkan array di seluruh kolom. Di sini Anda memiliki 3 * 10 kolom yang harus diubah menjadi 10 baris dari 3 kolom dalam tabel baru (plus
id
, dll)Main
Meja Anda hanya akan memilikiTabel ekstra Anda (
Top
) akan memilikiAkan ada 10 baris (atau lebih sedikit? Atau lebih?) Di
Top
setiap barisid
.Ini menghilangkan masalah asli Anda, dan membersihkan skema. (Ini bukan "normalisasi", seperti yang diperdebatkan di beberapa Komentar.)
Apakah tidak beralih ke MyISAM; itu akan pergi.
Jangan khawatir
ROW_FORMAT
.Anda perlu mengubah kode untuk melakukan
JOIN
dan menangani beberapa baris, bukan beberapa kolom.sumber
Saya menggunakan MySQL 5.6 di AWS RDS. Saya memperbarui mengikuti di grup parameter.
Saya harus mem-boot ulang instans DB agar perubahan grup parameter berlaku.
Selain itu, ROW_FORMAT = COMPRESSED tidak didukung. Saya menggunakan DINAMIS seperti di bawah ini dan berfungsi dengan baik.
sumber
Ukuran baris maksimum untuk tabel InnoDB, yang berlaku untuk data yang disimpan secara lokal dalam halaman database, sedikit kurang dari setengah halaman untuk 4KB, 8KB, 16KB, dan 32KB
Untuk halaman 16kb (default), kami dapat menghitung:
Pada dasarnya, Anda dapat memaksimalkan baris dengan:
Ingat, ini hanya akan meluap ke halaman overflow jika bidang> 767 byte. Jika ada terlalu banyak bidang 767 byte, itu akan rusak (melewati ukuran_kurang maksimum). Tidak biasa dengan latin1 tetapi sangat mungkin dengan utf-8 jika pengembang tidak berhati-hati.
Untuk kasus ini, saya pikir Anda mungkin bisa meningkatkan innodb_page_size menjadi 32kb.
di my.cnf:
Referensi:
sumber
Saya juga mengalami masalah yang sama. Saya menyelesaikan masalah dengan menjalankan sql berikut:
Tapi, saya pikir Anda harus tahu tentang Row Storage .
Ada dua jenis kolom: kolom dengan panjang variabel (seperti jenis VARCHAR, VARBINARY, dan BLOB dan TEXT) dan kolom dengan panjang tetap . Mereka disimpan di berbagai jenis halaman.
dan saat tujuan menyetel ROW_FORMAT adalah
Ingin tahu lebih banyak tentang DINAMIS dan Format Baris Terkompresi
sumber
Jika ini terjadi pada SELECT dengan banyak kolom, penyebabnya bisa jadi mysql membuat tabel sementara. Jika tabel ini terlalu besar untuk dimasukkan ke dalam memori, ia akan menggunakan format tabel temp default, yaitu InnoDB, untuk menyimpannya di Disk. Dalam kasus ini, batas ukuran InnoDB berlaku.
Anda kemudian memiliki 4 opsi:
ubah format tabel temp default menjadi MYISAM, inilah yang saya lakukan. Ubah my.cnf:
Mulai ulang mysql, kueri berfungsi.
sumber
Berikut tip sederhana untuk siapa pun yang tertarik:
Setelah memutakhirkan dari Debian 9 ke Debian 10 dengan 10.3.17-MariaDB, saya mengalami beberapa kesalahan dari database Joomla:
[Peringatan] InnoDB: Tidak dapat menambahkan bidang
field
di tabeldatabase
.table
karena setelah ditambahkan ukuran baris adalah 8742 yang lebih besar dari ukuran maksimum yang diperbolehkan (8126) untuk dicatat pada halaman daun indeks.Untuk berjaga-jaga, saya menetapkan innodb_default_row_format = DYNAMIC di /etc/mysql/mariadb.conf.d/50-server.cnf (toh defaultnya)
Kemudian, saya telah menggunakan phpmyadmin untuk menjalankan "Optimalkan tabel" untuk semua tabel di database Joomla. Saya pikir rekreasi meja yang dilakukan oleh phpmyadmin dalam prosesnya membantu. Jika Anda kebetulan menginstal phpmyadmin, cukup dengan beberapa klik saja.
sumber